如何在Java中将空值移到ArrayList的前面?

时间:2016-11-02 09:30:40

标签: java arraylist null

现在,我正在编写一种类似于Candy Crush的迷你游戏。我有一些问题让我的专栏正常落下。基本上,我需要ArrayList将所有空值排序到顶部,而不改变其余值的顺序。由于课程要求,我无法发布我的确切代码(带有“”的地方是我放入伪代码的地方),我基本上已经设置了:

{
     ArrayList<"Type"> x = new ArrayList<"type">();
     ArrayList<"Object Location"> y = new ArrayList<"Object Location">();
     int z = 0;
      for(int i=0; i<"ArrayListLength"; i++){
          if ("value at point i" ==null){
              z++;
          }
          else {
              x.add("location on grid");
              y.add(new "Object Location"(i, "located column", "Object At"(i,"located column")));
          }
      }
      for (int i=0; i<z; i++){
          "Location i on column"=null;
      }
      for (int i=z; i<"Array List Length"; i++){
          "Location i on column" = y.get(i-z);
      }
       return y;      
}

我不知道我做错了什么,而且非常令人沮丧。有什么提示吗?

3 个答案:

答案 0 :(得分:2)

您必须为Collections.sort方法提供自定义比较器,否则您将获得NPE

   List<String> languages = new ArrayList<>();
    languages.add(null);
    languages.add("java");
    languages.add(null);
    languages.add("c");
    languages.add("fortran");
    languages.add(null);
    Collections.sort(languages, new Comparator<String>() {

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

    System.out.println(languages);

答案 1 :(得分:1)

如果您想在前面创建包含null元素的原始列表的副本,只需迭代原始列表并使用add(x)追加或add(0, x)插入前面。

List<String> elements = Arrays.asList("foo", null, "bar", "blub", null, null);

List<String> result = new ArrayList<>();
for (String x : elements) {
    if (x == null) {
        result.add(0, x);
    } else {
        result.add(x);
    }
}
// now, result is [null, null, null, foo, bar, blub]
// and elements is still [foo, null, bar, blub, null, null]

如果要对列表就地进行排序,只需将Collections.sort与自定义Comparator一起使用,检查该元素是否为!= null。 (false < true,因此null值首先排序。)

Collections.sort(elements, Comparator.comparing(x -> x != null));
// now, elements is [null, null, null, foo, bar, blub], too

答案 2 :(得分:0)

如果剩下的Order没有改变,那么我猜这里使用两个列表是有意义的,检查所有非null的元素并将它放在另一个列表中,然后迭代旧列表(现在只有空值)并开始添加您之前创建的列表中的元素。通过这种方式,您将获得一个新的列表,其前面有Null个值,其余的列表未更改。