遇到数组列表 arrayList<int[]>



现在这是我想回答的问题:编写一个以稀疏数组为参数并返回的方法一个新的等效密集数组。密集数组只需要足够大来容纳所有的值。例如,如果稀疏数组中最后一个元素的索引为89,则生成的密集数组只需要保存90个值。

dense array:[3,8,4,7,9,0,5,0]这个数字是随机生成的。稀疏阵列是数组的arraylist[[0, 3],[1, 8],[2、4],[3、7],[4,9],[6 5]]所以在稀疏数组中如果生成的数字是!0那么它的值和索引将被存储在大小为2的数组中但如果生成的数字是0则不存储

当集合中的元素(如数组)有固定大小时。你的解决方案很好,这是一个快速的方法。

但是当你的元素没有固定的大小时,比如:[[1,2,3],[4,5],[6],[7,8,9,10,11]],你可以通过你的元素:

进行交互
for(int[] e : sparseArr)
{
    for(int number : e)
    {
        tree.add(number);
    }
}

无论你的sparseArr中有多少个元素,你的元素有多长>

要对元素进行排序,我建议您使用TreeSet<E>,元素推入树将自动排序。

所以如果你只想存储两个整数配对在一起,我建议使用HashMaps。在您的情况下,您将使用:

HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();

hashmap支持.containsKey(key);.containsValue(value);

如果要检查所有条目,可以将Map转换为entrySet:

for(Entry<Integer, Integer> e : map.entrySet()) {
    int one = e.getKey();
    int two = e.getValue();
}

除非你想做一些比仅仅存储2对整数更特殊的事情,我真的可以推荐这样做!

你需要的方法应该是这样的

public int[] sparseToDense (ArrayList<int[]> sparse) {
  int i = 0;
  int[] dense = new int[sparse.get(sparse.size()-1)[0]];
  int[] sp;
  ListIterator<int[]> iter = sparse.listIterator();
  while (iter.hasNext()) {
    sp = iter.next();
    while (sp[0] != i) {
      dense[i++] = 0;
    }
    dense[i++] = sp[1];
  }
  return dense;
}

这是另一种方法,因为您有java 8,您将能够使用流。但如果你是初学者,我建议你尝试for循环和数组,这对你的学习更有帮助。

     public static ArrayList<Integer> returnDense(ArrayList<int[]> sparse) {
        return sparse.stream().flatMap(p -> IntStream.of(p).boxed())
              .collect(Collectors.toCollection(ArrayList::new));
     } 

如果您决定将int[]更改为Integer[]

public ArrayList<Integer> returnDense(ArrayList<Integer[]> sparse) {
    return sparse.stream().flatMap(p -> Arrays.asList(p).stream()).filter(Objects::nonNull)
        .collect(Collectors.toCollection(ArrayList::new));
    }

.filter(Objects::nonNull)是要确保不会有空值,但如果你知道它不会有它,这是没有必要的。

最新更新