【问题标题】:String sorting null values字符串排序空值
【发布时间】:2016-03-05 04:20:43
【问题描述】:

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

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

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

感谢您的帮助。

【问题讨论】:

  • 发布你到目前为止尝试过的代码
  • 构建自己的比较器并将其传递给排序器。
  • 您的方法看起来不错,因为您不想实际对列表进行排序。您只需遍历 List 一次。如果您更喜欢创建新列表而不是创建新列表,则可以修改原始列表(每当遇到空值时,将其删除)。

标签: java sorting arraylist


【解决方案1】:

如果您使用的是 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());   

【讨论】:

    【解决方案2】:

    自定义比较器传递给排序:

    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】:

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

      【讨论】:

        【解决方案4】:

        您可以使用NullComparator from apache

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              怎么样:

              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());
              

              【讨论】:

                【解决方案8】:

                所有其他解决方案都涉及排序。正如你所提到的,你真的不需要排序。如果担心时间复杂度,您可以使用以下线性时间解决方案(就地):

                  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--;
                      }
                    }
                  }
                

                【讨论】:

                  【解决方案9】:

                  试试这个。

                      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);
                  

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

                  【讨论】:

                    【解决方案10】:

                    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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2015-09-07
                      • 1970-01-01
                      • 2018-01-12
                      • 1970-01-01
                      • 2022-12-09
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多