字符串排序空值

时间:2015-12-01 09:38:57

标签: java sorting arraylist

我有一个字符串arraylist,其中包含一些null值和一些字符串。我不想对arraylist进行排序,但我应该对arraylist进行排序,以便将null值放在最后。让我们说arraylist是{1,2,null,6,5,null, 3},我应该在{1,2,6,5,3,null,null}上得到空值。

解决方案,我目前有: 现在,我正在构建新的arraylist,如果值为null,我不会将其推送到新列表,否则我将其添加到新的arraylist。

还有其他更好的解决方案吗?

感谢您的帮助。

10 个答案:

答案 0 :(得分:10)

如果您使用的是Java 8,则可以轻松构建所需的比较器:

Arrays.sort(stringArray, Comparator.nullsLast(Comparator.naturalOrder()));

但是如果你不使用java 8,你可以使用下面的比较器

public class StringNullComparator implements Comparator<String> {
    public int compare(String stringOne, String stringTwo) {
        if (stringOne != null && stringTwo != null)
            return stringOne.compareTo(stringTwo);
        return (stringOne == stringTwo)?0:(stringOne==null? 1 : -1);
    }
}

您可以按照以下说明使用

Arrays.sort(stringArray, new StringNullComparator());   

答案 1 :(得分:5)

自定义比较器传递给sort:

public class StringComparator implements Comparator<String> {
    public int compare(String s1, String s2) {
        if (s1 != null && s2 != null)
            return s1.compareTo(s2);
        return (s1 == null) ? 1 : -1;
    }
}

然后:

Collectios.sort(list, new StringComparator());

答案 2 :(得分:1)

如果要避免显式迭代整个列表,可以使用ArrayList.indexOf()来查找空值,然后删除()它们。如果要保留列表中的值,则只需在列表末尾添加空值即可。但是,如果这是一个问题,我会想象这种方法在性能方面并不是很好。

答案 3 :(得分:1)

您可以使用NullComparator from apache

Collections.sort(list, new NullComparator());

答案 4 :(得分:0)

如何构造新的arraylist,如果它是一个实数值,则将其添加到新列表中,如果它是一个空的增量计数器。最后添加null的数量等于计数器值。

答案 5 :(得分:0)

如果要将null排序到末尾并保持非null元素的顺序,则Comparator会这样做:

class CompareStrings implements Comparator<String> {

    @Override
    public int compare(String o1, String o2) {
        if (o1 == null && o2 != null)
            return 1;
        if (o2 == null && o1 != null)
            return -1;
        return 0;
    }   
}

如果String都为空或非空,则它们将相等。如果只有一个为null,则它将比非空的那个小。

答案 6 :(得分:0)

怎么样:

class MyInteger implements Comparator<Integer> {
    public int compare(Integer arg0, Integer arg1) {
        if(arg1 == null) {
            return -1;
        }
        return 0;
    }
}

我们可以像以下一样使用它:

List<Integer> al = new ArrayList<Integer>();
al.add(1);
al.add(2);
al.add(null);
al.add(6);
al.add(5);
al.add(null);
al.add(3);

Collections.sort(al, new MyInteger());

答案 7 :(得分:0)

所有其他解决方案都涉及排序。如你所说,你真的不需要排序。如果时间复杂性是一个问题,您可以使用以下线性时间解决方案(就地):

  public static <T> void nullsToEndInPlace(List<T> l) {
    int i = 0;
    int j = l.size() - 1;
    while (i < j) {
      T left = l.get(i);
      T right = l.get(j);
      if (left != null) {
        i++;
      } else if (right == null) {
        j--;
      } else {
        l.set(i, right);
        l.set(j, null);
        i++;
        j--;
      }
    }
  }

答案 8 :(得分:0)

尝试一下。

    List<String> list = new ArrayList<>();
    list.add("BR64");
    list.add("SWG620");
    list.add("");
    list.add("sw0");
    list.add("R124");
    list.add("R219");
    list.add("TaGh20");
    list.add("SW6505");
    list.add("");
    list.add(null);
    list.add("SW_6505");
    list.add("swd_157");
    list.add("localhost");
    list.add("qaGh20_241");
    list.add("gen");
    list.add(null);
    list.add("taGh20");
    list.add("zen");
    list.add("QWG");
    list.add("SWG62_");
    list.add("SWG620");

    Collections.sort(list, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            if (o1 != null && o2 != null && o1.length() > 0 && o2.length() > 0) {
                return (Character.toLowerCase(o1.charAt(0)) == Character.toLowerCase(o2.charAt(0)))
                        ? o1.compareTo(o2)
                        : (Character.toLowerCase(o1.charAt(0)) + o1.substring(1))
                                .compareTo((Character.toLowerCase(o2.charAt(0)) + o2.substring(1)));
            } else {
                return (o1 == o2) ? 0 : ((o1 == null || o1 == "") ? 1 : -1);
            }
        }
    });
    System.out.println(list);

Output-:[BR64,gen,localhost,QWG,qaGh20_241,R124,R219,SW6505,SWG620,SWG620,SWG62_,SW_6505,sw0,swd_157,TaGh20,taGh20,zen,,,null,null]

答案 9 :(得分:0)

list.sort()sorted()都有一个关键参数,用于指定在进行比较之前在每个列表元素上要调用的函数。

例如,这是不区分大小写的字符串比较:

sorted("This is a test string from sohan".split(), key=str.lower)                                                                                                                   
['a', 'from', 'is', 'sohan', 'string', 'test', 'This'] 

在这里, key=str.lower() 会将每个字符串转换为小写,然后对结果进行排序。

For more info about sorting click here