我有这个ArrayList
[21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
以这种方式创建
for (int i = 0; i < number; i++) {
ArrayList.add(21+i);
}
在我的代码中,我必须删除,有时返回一些值而不改变其他值的位置。我试过
ArrayList.add(removedValue, null);
所以我有类似的东西
ArrayList = [21, 22, 23, null, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
但是这样我就无法使用集合对数组进行排序。
在不破坏我的阵列的情况下,我还能做些什么来解决这个问题吗?
答案 0 :(得分:4)
您应该实现自己的Comparator<Integer>
并对其进行排序。
下面的代码使用一个比较器来处理两个Integer
个对象,如果它们中的任何一个是null
,或者它们都是null
,那么就不会改变索引
Integer[] numbers = new Integer[] { 21, null, 23, 24, 25, 26, 27, 28,
29, 30, 31, 32, 33, 34, 35, 36 };
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(numbers));
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer arg0, Integer arg1) {
if (arg0 == null || arg1 == null)
return 0;
return arg0 - arg1;
}
});
答案 1 :(得分:0)
你应该看一下Guava lib,那里有一个很好的解释,为什么你不应该在Collections上有任何null。
https://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained
使用的一些例子。
public class OptionalInteger {
final static Optional<Integer> NULL = Optional.absent();
public static void main(String[] args) {
final ArrayList<Optional<Integer>> list = Lists.newArrayList();
for (int i = 21; i < 36; i++) {
list.add(Optional.fromNullable(i));
}
list.add(10, NULL);
list.add(12, NULL);
System.out.println(list);
Collections.sort(list, new Comparator<Optional<Integer>>() {
@Override
public int compare(Optional<Integer> o1, Optional<Integer> o2) {
if(!o1.isPresent())
return 1;
if(!o2.isPresent())
return -1;
return o1.get().compareTo(o2.get());
}
});
System.out.println(list);
}
}
答案 2 :(得分:0)
我建议你重新考虑你的模特。
你关心保留列表中的顺序,因为你想使用列表的索引作为键 - 那么为什么不使用Map或SortedMap?您可以使用枚举或某些自定义类型作为键而不是整数。
答案 3 :(得分:0)
试试这个...
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer arg0, Integer arg1) {
if (arg0 != null && arg1 != null) {
return arg0.compareTo(arg1);
}
if (arg0 == null) {
return 1;
}
return -1;
}
});