我有一个练习来输出用户按升序输入的所有字符串。
当用户输入“quit
”时,该程序应该停止。
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Collections;
public class Exercise2{
public static void main (String[] args) {
ArrayList<String> list=new ArrayList<>();
Scanner scanner = new Scanner(System.in);
String word="string";
while(!word.equals("quit")){ // cycle will continue till string will contain a word "quit".
System.out.println("Please enter a string line. String can be whatever you want. After you enter a string please press Enter");
word=scanner.nextLine();
if(word.equals("quit"))
break;
list.add(word);
}
Collections.sort(list, new Comparator<String>(){
public int compare(String o1, String o2){
if(o1.length()>o2.length()){
return 1;
}else{
return o1.compareTo(o2);
}
}
});
System.out.println(list);
}
}
有人可以解释为什么我的代码无效吗?我想和Comparator一起做。
答案 0 :(得分:3)
您的比较器违反了compare
的合同,该合同规定如果a>&gt; b然后b&lt;一定也必须是真的。但是,如果你通过&#34; a1&#34;和&#34; b&#34;如果你通过&#34; b&#34;你会得到1分。和&#34; a1&#34;你不会得-1而是1。
摘自JavaDoc:
实现者必须确保所有x和y的sgn(compare(x,y))== -sgn(compare(y,x))。
你需要保持一致,即如果你想首先比较长度,那么你需要这样做,只有当长度相等时才使用自然顺序:
public int compare(String o1, String o2){
//for Java 6 and below you could just do o1.length() - o2.length()
//as the return value doesn't have to be -1 or 1 but negative, 0 or positive
int result = Integer.compare( o1.length(), o2.length() ); /
if( result == 0 ) {
result = o1.compareTo(o2);
}
return result;
}
答案 1 :(得分:0)
两种选择,取决于你想要的。
1)如果您只想按字母顺序排列:
Collections.sort(list);
2)如果您希望按每个String
的长度排序:
编辑:根据更新后的评论,如果String.length
相等,则添加一个子句。
Collections.sort(list, new java.util.Comparator<String>() {
@Override
public int compare(String s1, String s2) {
if(s1.length() != s2.length()){
return s1.length() - s2.length();
}
return s1.compareTo(s2);
}
});