2014-01-23 39 views
1

我有此ArrayList数组列表和NULL值

[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

我觉得你不沟通这个问题非常好。一方面你想对arrayList进行排序,另一方面你想对它排序。你试图解决的问题究竟是什么? –

+0

@AmirArad:这是一款棋盘游戏。玩家可以从中挑选卡片并将卡片返回。我的问题是,当一个玩家返回一张卡没有进入正确的地方,所以我虽然排序数组。我创建了这个Integers的ArrayList,也许这是我的主要问题。 – Akumu

回答

4

您应该实施自己的Comparator<Integer>并对其进行排序。

下面的代码使用它把2个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; 

    } 
}); 
+0

我确认(+1)... – venergiac

+0

这不会帮助我,因为我的名单会改变。就像我说过的,我不应该改变其他数字的位置。如果我可以改变阵列中的位置,我可以设置一个“-100”的值。 – Akumu

+0

@Akumu所以你天才,你能告诉我一种方法来处理'空'有时像24等有时像34等? – Juvanis

0

你应该看看番石榴lib,有一个很好的解释,为什么你不应该在集合上有任何空。

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

我建议你重新考虑你的模型。

您关心的是保留列表中的顺序,因为您希望将列表的索引用作关键字 - 那么为什么不使用Map或SortedMap呢?您可以使用Enum或某种自定义类型作为键而不是整数。

+0

我不知道如何使用它们,但我会查找它们。感谢您的建议。 – Akumu

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