有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java字符串排序空值

我有一个带有一些null值和一些字符串的字符串数组列表。我不想对arraylist进行排序,但我应该对arraylist进行排序,使空值排在最后。假设arraylist为{1,2,null,6,5,null, 3},我应该在最后{1,2,6,5,3,null,null}获得空值

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

还有更好的解决办法吗

谢谢你的帮助


共 (6) 个答案

  1. # 1 楼答案

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

  2. # 3 楼答案

    要传递到排序的自定义比较器:

    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());
    
  3. # 4 楼答案

    如果希望将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都为空或非空,它们将进行相等的比较。如果只有一个为空,它将比非空的小

  4. # 5 楼答案

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

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

    但是如果您不使用Java8,您可以使用下面这样的比较器

    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());   
    
  5. # 6 楼答案

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