Java 中的词典排序创建了一个奇怪的顺序
Lexicographic sorting in Java creating a strange order
我正在尝试按数组内部的名称对对象数组进行排序。
grades[].name
我正在使用一种使用 compareTo 进行字典排序的插入方法,它有点工作,所以我知道我正确使用了 compareTo 但并非所有名称都被正确移动,我不确定这是否是我的理解词典的工作方式或者我的循环是否导致了问题。我知道词典编排会单独比较每个字母来确定位置。我最初认为它只是给字符串一个数值,并正在寻找一种方法来找到它,但我认为情况并非如此。我已经查看了有关此排序如何工作的其他问题,但它似乎并没有阐明我的问题。我想知道我的问题是循环、我对排序方法的理解还是其他原因导致了这个输出问题。
我有 3 个 class。调用 .insert 方法的对象是对包含我的实际数组的 class 的引用,以便该数组可以保持私有。
`GradeArray gradeArr = new GradeArray();
gradeArr.insert("Evans", 78, courseID);
gradeArr.insert("Smith", 77, courseID);
gradeArr.insert("Yee", 83, courseID);
gradeArr.insert("Adams", 63, courseID);
gradeArr.insert("Hashimoto", 91, courseID);
gradeArr.insert("Stimson", 89, courseID);
gradeArr.insert("Velasquez", 72, courseID);
gradeArr.insert("Lamarque", 74, courseID);
gradeArr.insert("Vang", 52, courseID);
gradeArr.insert("Creswell", 88, courseID);`
这是在数组中创建条目。
这是我的排序循环。
` public String reportgrades() //this is grade sorted by name
{
String output = "Sorted by name ";
int in, out;
StudentGrade temp; //this is to hold the orginal variable.
//for the first letter cycle
for (out = 1; out < nElems; out++) {
temp = grades[out];
in = out;
while (in > 0 && 0 < (grades[in - 1].name.compareTo(grades[in].name))) {
grades[in] = grades[in - 1];
in--;
}
grades[in] = temp;
}
for (int j = 0; j < nElems; j++) {
output += grades[j].name + ", ";
}
return output;
}`
这正在创建的输出是 Sorted by name Evans, Smith, Adams, Hashimoto, Stimson, Velasquez, Lamarque, Vang, Creswell, Yee,
我很困惑为什么埃文斯和史密斯在亚当斯之前。我试图查看文档以了解 compareTo 的工作方式,但我似乎没有看到任何可以给我任何相关信息的内容。
首先,将所有名称添加到列表中,然后排序:
Collections.sort(list);
您对 compareTo 的使用很好,但是您没有比较正确的元素以进行插入排序。您需要将 out
处的元素与每个较早的元素进行比较。但是在循环的第一步之后,您只是将 out
之前的元素相互比较。
您可以更改 while 循环以与 temp
:
进行比较
while (in > 0 && 0 < (grades[in - 1].name.compareTo(temp.name))) {
或者保留那个 while,但改变循环以交换数组中的元素,而不是仅仅将它们向右移动:
for (out = 1; out < nElems; out++) {
in = out;
while (in > 0 && 0 < (grades[in - 1].name.compareTo(grades[in].name))) {
// swap grades at in-1 and in
StudentGrade temp = grades[in];
grades[in] = grades[in - 1];
grades[in - 1] = temp;
in--;
}
}
移动值时算法出现问题。
你需要把 grades[in-1] = temp;在你的 while 语句中为了轮班工作。
我没有使用 GradeStudent 只是一个字符串,但你可以适应。
成绩数组只是一个例子。
public static String reportgrades() //this is grade sorted by name
{
String[] grades = {"Evans", "Smith", "Adams", "Hashimoto",
"Stimson", "Velasquez", "Lamarque", "Vang", "Creswell", "Yee"};
String output = "Sorted by name ";
int in, out;
String temp; //this is to hold the orginal variable.
//for the first letter cycle
long nElems = grades.length;
for (out = 1; out < nElems; out++) {
in = out;
while (in > 0 && 0 < (grades[in - 1].compareTo(grades[in]))) {
temp = grades[in];
grades[in] = grades[in-1];
grades[in-1] = temp;
in--;
}
}
for (int j = 0; j < nElems; j++) {
output += grades[j] + ", ";
}
return output;
}
我按照 vladwoguer 的回答将 grades[in-1] = temp;
移到了我的 while 循环中。我没有意识到我实际上并没有移动我想要的变量。在我重新插入原来的名字之前,我认为一切都必须移动。
我正在尝试按数组内部的名称对对象数组进行排序。
grades[].name
我正在使用一种使用 compareTo 进行字典排序的插入方法,它有点工作,所以我知道我正确使用了 compareTo 但并非所有名称都被正确移动,我不确定这是否是我的理解词典的工作方式或者我的循环是否导致了问题。我知道词典编排会单独比较每个字母来确定位置。我最初认为它只是给字符串一个数值,并正在寻找一种方法来找到它,但我认为情况并非如此。我已经查看了有关此排序如何工作的其他问题,但它似乎并没有阐明我的问题。我想知道我的问题是循环、我对排序方法的理解还是其他原因导致了这个输出问题。
我有 3 个 class。调用 .insert 方法的对象是对包含我的实际数组的 class 的引用,以便该数组可以保持私有。
`GradeArray gradeArr = new GradeArray();
gradeArr.insert("Evans", 78, courseID);
gradeArr.insert("Smith", 77, courseID);
gradeArr.insert("Yee", 83, courseID);
gradeArr.insert("Adams", 63, courseID);
gradeArr.insert("Hashimoto", 91, courseID);
gradeArr.insert("Stimson", 89, courseID);
gradeArr.insert("Velasquez", 72, courseID);
gradeArr.insert("Lamarque", 74, courseID);
gradeArr.insert("Vang", 52, courseID);
gradeArr.insert("Creswell", 88, courseID);`
这是在数组中创建条目。
这是我的排序循环。
` public String reportgrades() //this is grade sorted by name
{
String output = "Sorted by name ";
int in, out;
StudentGrade temp; //this is to hold the orginal variable.
//for the first letter cycle
for (out = 1; out < nElems; out++) {
temp = grades[out];
in = out;
while (in > 0 && 0 < (grades[in - 1].name.compareTo(grades[in].name))) {
grades[in] = grades[in - 1];
in--;
}
grades[in] = temp;
}
for (int j = 0; j < nElems; j++) {
output += grades[j].name + ", ";
}
return output;
}`
这正在创建的输出是 Sorted by name Evans, Smith, Adams, Hashimoto, Stimson, Velasquez, Lamarque, Vang, Creswell, Yee,
我很困惑为什么埃文斯和史密斯在亚当斯之前。我试图查看文档以了解 compareTo 的工作方式,但我似乎没有看到任何可以给我任何相关信息的内容。
首先,将所有名称添加到列表中,然后排序:
Collections.sort(list);
您对 compareTo 的使用很好,但是您没有比较正确的元素以进行插入排序。您需要将 out
处的元素与每个较早的元素进行比较。但是在循环的第一步之后,您只是将 out
之前的元素相互比较。
您可以更改 while 循环以与 temp
:
while (in > 0 && 0 < (grades[in - 1].name.compareTo(temp.name))) {
或者保留那个 while,但改变循环以交换数组中的元素,而不是仅仅将它们向右移动:
for (out = 1; out < nElems; out++) {
in = out;
while (in > 0 && 0 < (grades[in - 1].name.compareTo(grades[in].name))) {
// swap grades at in-1 and in
StudentGrade temp = grades[in];
grades[in] = grades[in - 1];
grades[in - 1] = temp;
in--;
}
}
移动值时算法出现问题。 你需要把 grades[in-1] = temp;在你的 while 语句中为了轮班工作。 我没有使用 GradeStudent 只是一个字符串,但你可以适应。 成绩数组只是一个例子。
public static String reportgrades() //this is grade sorted by name
{
String[] grades = {"Evans", "Smith", "Adams", "Hashimoto",
"Stimson", "Velasquez", "Lamarque", "Vang", "Creswell", "Yee"};
String output = "Sorted by name ";
int in, out;
String temp; //this is to hold the orginal variable.
//for the first letter cycle
long nElems = grades.length;
for (out = 1; out < nElems; out++) {
in = out;
while (in > 0 && 0 < (grades[in - 1].compareTo(grades[in]))) {
temp = grades[in];
grades[in] = grades[in-1];
grades[in-1] = temp;
in--;
}
}
for (int j = 0; j < nElems; j++) {
output += grades[j] + ", ";
}
return output;
}
我按照 vladwoguer 的回答将 grades[in-1] = temp;
移到了我的 while 循环中。我没有意识到我实际上并没有移动我想要的变量。在我重新插入原来的名字之前,我认为一切都必须移动。