为什么Collections.sort()不起作用?

时间:2017-03-18 21:10:40

标签: java sorting

我是java的新手。我正在编写一个代码,根据它的第一个字母对给定的对进行排序。我正在使用Collections.sort()对这些对进行排序,但不知何故它没有被排序。我无法弄清楚导致问题的原因。请检查以下代码。感谢。

package main.java.practice;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class StringChain {

  public static void main(String[] args) {

    List<Pair> arr = new ArrayList<>();
    arr.add(new Pair('i', 'a'));
    arr.add(new Pair('a', 'f'));
    arr.add(new Pair('g', 'h'));
    arr.add(new Pair('f', 'g'));
    arr.add(new Pair('z', 'i'));

    Collections.sort(arr, new Comparator<Pair>() {
        @Override
        public int compare(Pair o1, Pair o2) {
            if (o1.a < o2.b) return 1;
            else return 0;
        }
    });

    // Expected output should be
    //   a f
    //   f g
    //   g h
    //   i a
    //   z i
    for( Pair x : arr) {
        System.out.println(x.a  + " " + x.b);
    }
    // Actual output
    //  i a
    //  a f
    //  g h
    //  f g
    //  z i

  }

}

class Pair {

    char a;
    char b;

    Pair() {};
    Pair(char a, char b) {
        this.a = a;
        this.b = b;
    }
 }

3 个答案:

答案 0 :(得分:5)

您的比较方法实施错误。

试一试:

Collections.sort(arr, new Comparator<Pair>() {
        @Override
        public int compare(Pair o1, Pair o2) {
            return Character.compare(o1.a, o2.b);
        }
    });

此外,如果您使用java 8,则可以按如下方式更新代码:

 arr.sort((o1, o2) -> Character.compare(o1.a, o2.a));

答案 1 :(得分:1)

比较者应该返回1,-1,0

&#xA;&#xA;
  new Comparator&lt; Pair&gt;(){&#xA; @越权#XA; public int compare(Pair o1,Pair o2){&#xA; if(o1.a&lt; o2.b){return 1;}&#xA;否则if(o1.a&gt; o2.a){return -1}&#xA; else {return 0;}&#xA; }&#XA;  
&#XA;

答案 2 :(得分:0)

您需要在可比较的实施中涵盖3个可能的选项:

 when (o1.a < o2.a) 
 when (o1.a > o2.a) 
 when (o1.a = o2.a) 

但你基本上省略了一个代码无法正常工作的原因