我无法弄清楚比较器

时间:2011-04-21 20:25:00

标签: java comparator

我正在尝试对一个arraylist进行排序,但我无法将我的头围绕在比较器上。我不明白如何定义从文本文件创建的arraylist中的可排序字段。此外,我不确定比较器逻辑。在我看来,创建一组比较器函数,然后再调用它们。这是真的?

到目前为止,我的代码看起来像这样:

public class coord implements Comparator<Sort> {
    private int index;
    private int index2;
    private double dista;
}

public class Sort {
List<Sort> coords = new ArrayList<Sort>();


public static void main(String[] args) throws Exception {
    ArrayList dist = new ArrayList();
    File file = new File("2.txt");
    FileWriter writer = new FileWriter("2c.txt");
    try {
        Scanner scanner = new Scanner(file).useDelimiter("\\s+");

        while (scanner.hasNextLine())
        {
            int index = scanner.nextInt();
            int index2 = scanner.nextInt();
            double dista = scanner.nextDouble();
            System.out.println(index + " " + index2 + " " + dista);
        }
    }
}
        public class EmpSort {
            static final Comparator<coord> SENIORITY_ORDER =
                                         new Comparator<coord>() {
                public int compare(coord e1, coord e2) {
                    return e2.index().compareTo(e1.index());
                }
            };
            static final Collection<coord> coords = ;

            public static void main(String[] args) {
                List<Sorted>e = new ArrayList<Sorted>(coords);
                Collections.sort(e, SENIORITY_ORDER);
                System.out.println(e);

我感谢任何人都能给予的任何帮助。

1 个答案:

答案 0 :(得分:1)

比较器逻辑很简单。排序元素数组时,您有两种选择 - 在每个元素上使用Comparable进行排序(假设有一个)或提供Comparator。如果您的数组包含复杂元素或存在不同的排序条件,那么后者可能就是您需要使用的选项。

每次调用比较器时,必须说明元素1是否“小于”元素2,在这种情况下返回负数,元素1“大于”元素3,在这种情况下返回正数。否则,如果元素相等,则返回0.您还可以在比较值之前进行引用和空比较,以便null元素在逻辑上“小于”非null元素,依此类推。

如果元素“相等”,那么您可能希望按辅助字段排序,然后排序第三个字段并继续排序,直到排序顺序明确。

类Complex的简单比较器,其字段为a&amp; b我们想对a进行排序:

class Complex {
  public String a = "";
  public String b = "";
}

//...

Collections.sort(someList, new Comparator<Complex>() {
  public int compare(Complex e1, Complex e2) {
    if (e1 == e2) {
      // Refs could be null or equal
      return 0;
    }
    if (e1 == null && e2 != null) {
      return -1;
    }
    if (e2 == null && e1 != null) {
      return 1;
    }
    if (e1.a == e2.a) {
      return 0;
    }
    if (e1.a == null && e2.a != null) {
      return -1;
    }
    if (e1.a != null && e2.a == null) {
      return 1;
    }
    // Just use the Comparable on the fields
    return e1.a.compareTo(e2.a);
  }
});