use*_*571 5 java sorting linked-list comparable
我需要按字符串的长度对LinkedList的字符串进行排序,但是希望保持相同长度字符串的顺序(不按字典顺序排序).
样本输入:
this
is
just
a
test
Run Code Online (Sandbox Code Playgroud)
样本输出:
a
is
this
just
test
Run Code Online (Sandbox Code Playgroud)
我试图用一个Comparable<LinkedList<String>>和一个compareTo方法做这个,但我没有得到正确的输出(我仍然按字典顺序排序)
public class Q3_sorting implements Comparable<LinkedList<String>> {
Scanner keyboardScanner = null;
LinkedList<String> fileList = new LinkedList<String>();
Run Code Online (Sandbox Code Playgroud)
// [...]这里有一些代码
public int compareTo(LinkedList<String> o) {
// TODO Auto-generated method stub
o = fileList;
for (int i = 0; i < fileList.size() -1; i++) {
if (fileList.get(i).length() == o.get(i+1).length()) {
return 0;
}
if (fileList.get(i).length() > o.get(i+1).length()) {
return -1;
}
if (fileList.get(i).length() < o.get(i+1).length()) {
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
然后
Q3_sorting sort = new Q3_sorting(args);
Collections.sort(sort.fileList);
我在我的主要方法中使用.然后我打印出清单......
但我得到这个作为输出:
a
is
just
test
this
Run Code Online (Sandbox Code Playgroud)
我该如何纠正这个问题?
你应该创建一个比较器:
public class Q3_sorting implements Comparator<String> {
public int compare(String a, String b) {
return a.length() - b.length();
}
Run Code Online (Sandbox Code Playgroud)
然后使用以下方法对其进行排序:
Collections.sort(list, new Q3_sorting());
Run Code Online (Sandbox Code Playgroud)
请注意,您要做的是对List中的字符串进行排序.通过实现List的比较器(或类似的,因为它在这里工作的目的相同),你告诉JVM的是你要比较不同的List.
你也可以通过在类中实现Comparable来实现你的目标,但是你不能只要String是最终的,所以你不能扩展.因此除了实现比较器之外别无他法,这也比较简单:)
使用Collections.sort(list, comparator)过载.你需要一个Comparator<String>不是Comparator<LinkedList<String>>.请注意,Collections.sort的javadoc保证了一个稳定的排序(保持相等字符串的顺序,根据比较器等于平均值).
您正在对字符串进行排序,而不是对字符串列表进行排序。为此,您需要定义 aComparator<String>来比较两个字符串的长度,如下所示:
public class ByLength implements Comparator<String> {
@Override
public int compare(String a, String b) {
return a.length() - b.length();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,要对列表进行排序,您需要调用:
Collections.sort(sort.fileList, new ByLength());
Run Code Online (Sandbox Code Playgroud)
另请注意,对 a 进行排序的LinkedList效率非常低,您应该使用 anArrayList来代替。