2011-04-19 59 views
1

我需要一个数组类型来存储对象。但我需要两种类型的存取属性的是这样的:java中的两个不同类型的索引数组

数组[0] >>> object1

阵列[ “一”] >>> object1

这意味着索引0(一个整数)和索引a(一个字符串)取消引用数组中的同一个对象。为了存储对象,我认为我们需要集合,但我如何访问上面提到的属性?

+0

请问1名映射到“B”,2为“C”,等等,或者是由数字和字符串任意访问这可能不会通过模式彼此相关? – justkt 2011-04-19 14:26:48

+0

0映射到字符串键,1映射到另一个字符串键等,但它们显示数组中的同一对象 – mausmust 2011-04-19 14:30:04

+1

您多久添加一次/从该“映射”中删除元素,以及如何通过索引或按键?正如答案中已经指出的那样,你可以创建一个由列表和地图组成的类,但是对上述问题的回答可以提供实现细节的提示(即是否存储key-> index或index->关键映射)。 – Thomas 2011-04-19 14:41:54

回答

2

从字符串键,数字键地图:

Map<String, Integer> keyMap = new HashMap<String, Integer>(); 
keyMap.put("a", o); 
// etc 

然后创建你的对象,其中的MyObject是值类型的列表:

List<MyObject> theList = new ArrayList<MyObject>(); 

通过访问整数:

MyObject obj = theList.get(0); 

Acc ess by String

MyObject obj = theList.get(keyMap.get("a")); 

这需要维护您的关键数据结构,但允许从一个数据结构访问您的值。

可以encapsulte这是一类,如果你喜欢:

public class IntAndStringMap<V> { 
    private Map<String, Integer> keyMap; 

    private List<V> theList; 

    public IntAndStringMap() { 
     keyMap = new HashMap<String, Integer>(); 
     theList = new ArrayList<V>(); 
    } 

    public void put(int intKey, String stringKey, V value) { 
     keyMap.put(stringKey, intKey); 
     theList.ensureCapacity(intKey + 1); // ensure no IndexOutOfBoundsException 
     theList.set(intKey, value); 
    } 

    public V get(int intKey) { 
     return theList.get(intKey); 
    } 

    public V get(String stringKey) { 
     return theList.get(keyMap.get(stringKey)); 
    } 
} 
1

数组仅支持indecies。

看来你可以通过索引和按键来查找对象。在这种情况下,我建议你有两个集合。每种类型的查找一个。

List<MyObject> list = new ArrayList<MyObject>(); 
Map<String, MyObject> map = new HashMapList<MyObject>(): 

// array[0] >>> object1 
MyObject object0 = list.get(0); 

// array["a"] >>> object1 
MyObject objectA = map.get("a"); 
+0

我们如何将它们合并为一个?我们应该重写ArrayList add,get等方法吗? – mausmust 2011-04-19 14:29:23

+1

@mausmust:不,当你可以使用构图时不要继承。您可以使用'add(key,value)','get(index)'和'get(key)'方法创建一个包含列表和地图的自定义类型。 – Henning 2011-04-19 14:34:51

+0

你为什么要把它们合并成一个?如果你有一个数据库有两种执行查找的方法,你有两个indecies。无论如何,你不能将添加,获得和许多其他人结合起来,因为他们采取不同的论点。如果你真的必须这样做,你可以创建一个包装器来结合两者。 – 2011-04-19 14:35:55