2011-12-15 20 views
5

我想保留Java列表中項目的索引是固定的。如何在Java中保留列表索引

示例代碼:

import java.util.ArrayList; 
public class Test { 
    public static void main(String[] args) { 
     ArrayList<Double> a = new ArrayList<Double>(); 
     a.add(12.3); 
     a.add(15.3); 
     a.add(17.3); 

     a.remove(1); 
     System.out.println(a.get(1)); 
    } 
} 

這將輸出17.3。問題是17.3在索引2上,現在它在索引1上!

刪除元素時,有什麼方法可以保留其他元素的索引嗎?還是有另一類更適合這個目的?

注意:我不想要一個固定大小的集合。

回答

5

您可能需要使用java.util.SortedMapint鍵:

import java.util.*; 
public class Test { 

    public static void main(String[] args) 
    { 
     SortedMap<Integer, Double> a = new TreeMap<Integer, Double>(); 
     a.put(0, 12.3); 
     a.put(1, 15.3); 
     a.put(2, 17.3); 

     System.out.println(a.get(1)); // prints 15.3 
     System.out.println(a.get(2)); // prints 17.3 

     a.remove(1); 

     System.out.println(a.get(1)); // prints null 
     System.out.println(a.get(2)); // prints 17.3 
    } 
} 
  • SortedMap是可變大小的集合
  • 它存儲映射到一個有序的一套鑰匙值(類似List的指數)

java.util.List#remove(int)沒有實施可以保留指數,因爲規範如下:

刪除此列表中指定位置的元素(可選操作)。將任何隨後的元素向左移(從其索引中減去一個元素)。返回從列表中移除的元素。

5

而不是調用a.remove(1)你可以做a.set(1, null)。這將使所有元素保持在同一位置,同時仍然「去除」索引1處的值。

+0

這樣,我應該實現一個新的列表類型,有沒有什麼標準? – MhdSyrwan 2011-12-15 22:18:59

+0

設置方法*是* List接口的標準方法。請參閱http://docs.oracle.com/javase/6/docs/api/java/util/List.html#set%28int,%20E%29 – 2011-12-15 22:23:23

+0

「set」當然是標準的,我的意思是我想要一個使用這種機制的標準類 – MhdSyrwan 2011-12-15 22:46:39

4

如果索引和值之間的關係應該始終相同,則使用java.util.Map

2

而是與呼叫刪除元素要刪除的元素設置爲null的:

即:

import java.util.ArrayList; 
public class Test 
{ 
    public static void main(String[] args) 
{ 
     ArrayList<Double> a = new ArrayList<Double>(); 
     a.add(12.3); 
     a.add(15.3); 
     a.add(17.3); 

     a.set(1, null); 
     System.out.println(a.get(1)); 
    } 
} 
2

你可以使用一個HashMap<Integer, Double>。你可以使用

myMap.put(currentMaximumIndex++, myDoubleValue); 

這樣添加項目,指數將是獨一無二的,如果你需要稀疏存儲你會合理還好,並取出值不會傷害現有的。

1

除上述回答它也建議你應該使用LinkedHashMap<Integer,Double>,而不是常規的Hashmap 它會保留在其中插入元素的順序。

相關問題