Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按字段对对象进行排序_Java_Sorting_Comparator - Fatal编程技术网

Java 按字段对对象进行排序

Java 按字段对对象进行排序,java,sorting,comparator,Java,Sorting,Comparator,问题是对大量POJO对象进行排序 class Entity{ String key1; String key2; String key3; String key4; } 按所有字段的字母顺序排列。这意味着,首先我们要按键1排序,然后按键2排序,等等。该键中的任何一个都可以为空。问题是最简单的方法。一个很好的方法是将所有键附加在一起,然后使用比较器- private static int nullSafeCompare(String a, String b){

问题是对大量POJO对象进行排序

class Entity{
    String key1;
    String key2;
    String key3;
    String key4;
}

按所有字段的字母顺序排列。这意味着,首先我们要按键1排序,然后按键2排序,等等。该键中的任何一个都可以为空。问题是最简单的方法。

一个很好的方法是将所有键附加在一起,然后使用
比较器
-

private static int nullSafeCompare(String a, String b){
    if (a==b) return 0;
    if (a == null) return -1;
    if (b == null) return 1;
    return a.compareTo(b);
}


int compare(Entity a, Entity b){
   // if a and b can also be null:
   if (a==b) return 0;
   if (a==null) return -1;
   if (b==null) return 1;

   int c = nullSafeCompare(a.key1, b.key1);
   if (c != 0) return c;

   c = nullSafeCompare(a.key2, b.key2);
   if (c != 0) return c;

   c = nullSafeCompare(a.key3, b.key3);
   if (c != 0) return c;

   return nullSafeCompare(a.key4, b.key4);
}
我在这里做的是。。。。。一个实体的所有键按照需要进行比较的顺序追加在一起,然后与另一个实体进行比较

在追加之前,您可能还需要修剪每个值

编辑: 为了使代码正常工作,还需要用
空格分隔每个键


代码固定在上面。感谢@Thilo的指点。

你可能会从这个答案中得到一两个想法:另外:非常感谢我在搜索结果中错过的所有示例。当然,这假设这些键中的任何一个都为null并不代表一个bug,在这种情况下,你应该继续并抛出NPE。是的。问题中提到了能够处理null。通常,NPE也可以。如果所有键的长度不同,则将它们附加在一起可能不起作用,不过:
{'AB','C'}
应该在
{'a','BD'}
之后,即使
ABC
ABD
之前排序。所有键都应该用空格分隔。是的,你是对的……可能的解决方案是在每个键的末尾追加
空格。因此,
result.append(s!=null?s:;)
将成为
result.append(s!=null?s:;).append(“”)
。这样,我想现在如果我们比较
{'AB','C'}
{'A','BD'}
。。。这应该给出正确的答案…如果我错了,请纠正我,除非键本身可以包含空格。或者可能不包含空格…你又对了<代码>{'A','C'}
应该在
{'A B'}
之前。但它不会。我能想到的可能解决方案是使用不同的
dilimiter
而不是
空格
,该空格的顺序较低,但不会在键内使用。
// all the keys of an entity are appended and than compared with other entity
int compare(Entity e1, Entity e2){
  return appendAndHandleNull(e1.key1, e1.key2, e1.key3).compareTo(appendAndHandleNull(e2.key1, e2.key2, e2.key3));
}



/** 
 * method to get all keys of an entity in appended form
 */
private static final String appendAndHandleNull(String list...){
   StringBuilder result = new StringBuilder ();
   for(String s : list){
      result.append(s!=null?s:"").append(" ");//note: a space is appended after each key
   }
   return result.toString();
}