2015-10-15 67 views
0

现在,我试图回答这个问题: 编写一个将稀疏数组作为参数的方法,并返回一个新的等价密集数组。密集数组只需要足够大以适应所有的值。例如,如果稀疏数组中的最后一个元素处于索引89处,则得到的密集数组只需要保存90个值。ArrayList存在问题<int[]>

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

+0

你是什么意思的密集?拼凑'arraylist'? – sam

+0

@ sam2090,不,稀疏ArrayList是数组元素的索引位置和它们的值的列表,其中如果值为0,则省略元素。密集数组是一个标准数组,其中所有元素都包含它们的值,即使它是0. – Kiz

+0

那么,你解决了吗? –

回答

0

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

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

包含HashMap支持.containsKey(key);以及.containsValue(value);

如果要检查所有项目,你可以转换映射到的entrySet:

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

除非你想要做一些比存储2对整数更特别的东西我真的可以推荐这样做!

2

当您的集合中元素(作为数组)的固定大小时。您的解决方案可以,这是一个快速的方法。

但是当你的元素没有一个固定的大小,如:[[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>,元素推入树会自动排序。

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

我有一个sp = iter的问题。下一个();我不认为我不认为它是listIterator方法的一部分 – ansa

+0

因为sp不是一个对象 – ansa

+0

next()应该有一个小写n 已编辑答案为此并将迭代器类型的对象设置为int [] – Kiz

0

只是另一种方式来做到这一点,因为你的Java 8中,您将能够使用流。但如果你是初学者,我建议你尝试使用循环和数组,这对你的学习会更好。

 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)是,以确保不会有空值,但是如果你知道会不会有它,这是没有必要的。