对 java 中的 ArrayList<Integer> 的数组进行排序
Sort an Array of ArrayList<Integer> in java
我想按 ArrayLists 元素的第一个 int 对 ArrayList 的 Array 进行排序。
我试图覆盖 Comparator class 的比较方法,但它抛出:
Exception in thread "main" java.lang.NullPointerException
at BikeGA.compare(BikeGA.java:515)
at BikeGA.compare(BikeGA.java:1)
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:351)
at java.util.TimSort.sort(TimSort.java:230)
at java.util.Arrays.sort(Arrays.java:1438)
at BikeGA.main(BikeGA.java:512)
密码是:
int max_generations = 20;
static ArrayList<Integer>[] population = new ArrayList[max_generations];
Arrays.sort(population, new Comparator<ArrayList<Integer>>(){
@Override
public int compare(final ArrayList<Integer> entry1, final ArrayList<Integer> entry2){
return entry1.get(0).compareTo(entry2.get(0));
}
});
有人可以帮助我吗?
谢谢
您正在比较 2 个数组,但没有检查比较对象是否存在...
int max_generations = 20;
static ArrayList<Integer>[] population = new ArrayList[max_generations];
Arrays.sort(population, new Comparator<ArrayList<Integer>>(){
@Override
public int compare(final ArrayList<Integer> entry1, final ArrayList<Integer> entry2){
Integer value1 = entry1.get(0) == null : -1 ? entry1.get(0);
Integer value2 = entry2.get(0) == null : -1 ? entry2.get(0);
return value1.compareTo(value2);
}
});
您的比较器应该处理 null 或空的 ArrayList
s,以便它可以处理您放入数组中的任何数据:
@Override
public int compare(final ArrayList<Integer> entry1, final ArrayList<Integer> entry2){
if (entry1 == null && entry2 == null)
return 0;
if (entry1 == null)
return 1;
if (entry2 == null)
return -1;
if (entry1.isEmpty() && entry2.isEmpty())
return 0;
if (entry1.isEmpty())
return 1;
if (entry2.isEmpty())
return -1;
return entry1.get(0).compareTo(entry2.get(0));
}
这会将空元素放在数组的末尾,空列表放在它们之前。
在我的案例中,对象是:
public class Edge {
private Integer weight;
public Edge(Integer weight) {
this.weight = weight;
}
public Integer getWeight() {
return weight;
}
}
然后我从其他 class:
调用 sort for (List edges = new ArrayList<>();)
Collections.sort(edges,(edge1,edge2) -> edge1.getWeight().compareTo(edge2.getWeight()));
结果如下:
Exception img
解决方案是初始化对象的值:
public class Edge {
private Integer weight = 0;
public Edge(Integer weight) {
this.weight = weight;
}
public Integer getWeight() {
return weight;
}
}
而且有效!!!
code 0
我想按 ArrayLists 元素的第一个 int 对 ArrayList 的 Array 进行排序。 我试图覆盖 Comparator class 的比较方法,但它抛出:
Exception in thread "main" java.lang.NullPointerException
at BikeGA.compare(BikeGA.java:515)
at BikeGA.compare(BikeGA.java:1)
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:351)
at java.util.TimSort.sort(TimSort.java:230)
at java.util.Arrays.sort(Arrays.java:1438)
at BikeGA.main(BikeGA.java:512)
密码是:
int max_generations = 20;
static ArrayList<Integer>[] population = new ArrayList[max_generations];
Arrays.sort(population, new Comparator<ArrayList<Integer>>(){
@Override
public int compare(final ArrayList<Integer> entry1, final ArrayList<Integer> entry2){
return entry1.get(0).compareTo(entry2.get(0));
}
});
有人可以帮助我吗? 谢谢
您正在比较 2 个数组,但没有检查比较对象是否存在...
int max_generations = 20;
static ArrayList<Integer>[] population = new ArrayList[max_generations];
Arrays.sort(population, new Comparator<ArrayList<Integer>>(){
@Override
public int compare(final ArrayList<Integer> entry1, final ArrayList<Integer> entry2){
Integer value1 = entry1.get(0) == null : -1 ? entry1.get(0);
Integer value2 = entry2.get(0) == null : -1 ? entry2.get(0);
return value1.compareTo(value2);
}
});
您的比较器应该处理 null 或空的 ArrayList
s,以便它可以处理您放入数组中的任何数据:
@Override
public int compare(final ArrayList<Integer> entry1, final ArrayList<Integer> entry2){
if (entry1 == null && entry2 == null)
return 0;
if (entry1 == null)
return 1;
if (entry2 == null)
return -1;
if (entry1.isEmpty() && entry2.isEmpty())
return 0;
if (entry1.isEmpty())
return 1;
if (entry2.isEmpty())
return -1;
return entry1.get(0).compareTo(entry2.get(0));
}
这会将空元素放在数组的末尾,空列表放在它们之前。
在我的案例中,对象是:
public class Edge {
private Integer weight;
public Edge(Integer weight) {
this.weight = weight;
}
public Integer getWeight() {
return weight;
}
}
然后我从其他 class:
调用 sort for (List edges = new ArrayList<>();)Collections.sort(edges,(edge1,edge2) -> edge1.getWeight().compareTo(edge2.getWeight()));
结果如下: Exception img
解决方案是初始化对象的值:
public class Edge {
private Integer weight = 0;
public Edge(Integer weight) {
this.weight = weight;
}
public Integer getWeight() {
return weight;
}
}
而且有效!!! code 0