如何在arraylist

时间:2017-10-10 13:32:27

标签: java arraylist comparator

我有一个练习来输出用户按升序输入的所有字符串。
当用户输入“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一起做。

2 个答案:

答案 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);
            }
        });