现在,我正在编写一种类似于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;
}
我不知道我做错了什么,而且非常令人沮丧。有什么提示吗?
答案 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
个值,其余的列表未更改。