2015-10-15 76 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)是,以確保不會有空值,但是如果你知道會不會有它,這是沒有必要的。