我在排序List<List<Object>>时遇到了一个问题。我已经创建了一个自定义比较器,并在其中编写了对数据进行排序的代码。
public class CustomComparator implements Comparator<List<Object>>
{
static int i = 0;
public int compare(List<Object> o1, List<Object> o2) {
if (i < o1.size()) {
System.out.println(i);
Object obj1 = o1.get(i);
Object obj2 = o2.get(i);
if (obj1 != null && obj2 != null) {
int value = compareTo(obj1.toString(), obj2.toString());
if (value == 0) {
i++;
compare(o1, o2);
}
return value;
}
if (obj1 == null && obj2 != null) {
return -1;
}
if (obj1 != null && obj2 == null) {
return 1;
}
if (obj1 == null && obj2 == null) {
i++;
compare(o1, o2);
}
}
else{
i=0;
}
return 0;
}
public int compareTo(String value1, String value2) {
return value1.compareTo(value2);
}
}我尝试实现的逻辑是,首先它将尝试使用第0个位置的对象对进行排序。如果第0个位置的值等于或为空,则它将使用第二个position.etc处的对象进行排序。如果其中任何一个值为空,则该元素将被下移。但是,当我尝试使用我编写的代码进行排序时,它会得到排序,但既不是升序也不是降序。它只是被打乱了。
发布于 2016-05-05 13:57:18
在这里使用递归没有任何意义。只需在循环中迭代两个List,以比较它们的元素。
您的递归实现不起作用,因为您忽略了递归调用返回的值。使用静态变量来保存索引也不是一个好主意。如果您的Comparator实例被两个线程并发使用,会发生什么?
发布于 2016-05-05 14:06:05
尝尝这个,
public int compare(List<Object> o1, List<Object> o2) {
public int compare(List<Object> o1, List<Object> o2) {
int i=0;
//TODO validation here for null check
while(i< o1.size()){
Object obj1 = o1.get(i);
Object obj2 = o2.get(i);
if (obj1 == null && obj2 != null) {
return -1;
}else if (obj1 != null && obj2 == null) {
return 1;
}else if(obj1 != null && obj2 != null){
int value = compareTo(obj1.toString(), obj2.toString());
if(value!=0){
return value;
}
}
i++;
}
return 0;
}
}发布于 2016-05-05 14:20:56
public static void main(String args[]) {
List<List<String>> list = new ArrayList<>();
List<String> a = new ArrayList<>();
a.add("c");
a.add("a");
List<String> b = new ArrayList<>();
b.add("h");
b.add("b");
list.add(a);
list.add(b);
Collections.sort(list,new Comparator<List<String>>() {
@Override
public int compare(List<String> o1, List<String> o2) {
Collections.sort(o1);
Collections.sort(o2);
//Compare your list based on your criteria
}
});
}https://stackoverflow.com/questions/37043378
复制相似问题