我正在尝试对一个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);
我感谢任何人都能给予的任何帮助。
答案 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);
}
});