数组列表和空值

时间:2014-01-23 15:43:36

标签: java arraylist null

我有这个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]

但是这样我就无法使用集合对数组进行排序。

在不破坏我的阵列的情况下,我还能做些什么来解决这个问题吗?

4 个答案:

答案 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;
        }
    });