遇到arraylist arrayList <int []>

时间:2015-10-15 00:44:54

标签: java

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

密集阵列:[3,8,4,7,9,0,5,0]该数字是随机生成的。 稀疏数组是数组[[0,3],[1,8],[2,4],[3,7],[4,9],[6,5]]的一个列表 所以在稀疏数组中,如果生成的数字是!0,则该值及其索引存储在大小为2的数组中,但如果生成的数字为0,则不存储任何内容

4 个答案:

答案 0 :(得分:2)

当您的集合中的元素(作为数组)具有固定大小时。你的解决方案没问题,这是一种快速的方式。

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

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

无论您的sparseArr中有多少元素,您的元素多长时间&gt;

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

答案 1 :(得分:0)

因此,如果您只想存储2个整数配对,我建议使用HashMaps。在您的情况下,您将使用:

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

HashMaps支持.containsKey(key);以及.containsValue(value);

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

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

除非你想做一些比存储2个配对整数更特殊的东西,否则我真的可以这样做!

答案 2 :(得分:0)

你所追求的方法应该做这样的事情

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

答案 3 :(得分:0)

只是另一种方法,因为你有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)是确保不会有空值,但如果你知道不会有空值,那就没有必要了。