2012-12-02 86 views
1

我真的需要解决一个我陷入了3天的问题。任何帮助,将不胜感激。按对象属性对元素进行分组

我有一个Car品牌模型颜色实例变量。
我有一个Preferences品牌模型颜色实例变量。
我有一个preferences(Key = name,value = Car)包含人名作为关键字的HashMap和他们希望作为值驱动的Car。
最后,我有一个names ArrayList,其中包含系统中的所有名称。

我想以某种方式根据他们想驾驶的汽车对人员进行分组。
例如我所要的输出是这样的:

福特福克斯,2006年,蓝:尼克,比尔,吉姆
欧宝雅特,2008年,黑色:乔,乔治
奔驰CLK,2009年,黑色:史蒂夫,克里斯,约翰

我想到的第一件事是,我可以把所有的重复列表中,然后得到该名单的名称,但我想通了,我不能形成组的人根据他们喜欢的车。所以,我认为下面这段代码根本没有帮助。

Preferences[] p = new Preferences[preferences.size()]; 

for (int i = 0; i < preferences.size(); i++) { 
    p[i] = (Preferences) preferences.get(names.get(i)); 
    Car car = new Car(p[i].getBrand(), p[i].getModel(), p[i].getColor()); 
    if (!set.add(car)) { //duplicate 
     System.out.println("Duplicate!"); 
     listOfDuplicates.add(car); 
    } 
} 

有什么我可以做的吗?

+0

那么'Preferences'类又有什么用呢? – arshajii

+0

首选项不是Car [首选数据的分层集合中的节点](http://docs.oracle.com/javase/1.4.2/docs/api/java/util/prefs/Preferences.html) – vels4j

+0

你应该使用番石榴的MultiMap作为@JBNizet所说的 –

回答

4
Map<Car, List<String>> namesByCar = new HashMap<Car, List<String>>(); 
for (Map.Entry<String, Car> entry : preferences) { 
    String name = entry.getKey(); 
    Car car = entry.getValue(); 
    List<String> names = namesByCar.get(car); 
    if (names == null) { 
     names = new ArrayList<String>(); 
     namesByCar.put(car, names); 
    } 
    names.add(name); 
} 

在这里你去...

这将是更容易与番石榴的Multimap之。

+0

这只适用于在'preferences'中同一个'Car'实例用于一辆车的所有事件。否则必须覆盖'Car'的'equals()'和'hashCode()'。 – lost

相关问题