2012-03-03 71 views
0

我有以下形式java找到的獨特屬性的對象列表中的

Person object with attributes and values 
name=x, state=va 
name=x, state=nj 
name=x, state=va 
name=x, state=va 
name=x, state=md 
name=x, state=va 

我想找到獨有的狀態值作爲數組或列表對象的列表。 Google收藏集或Java提供此功能嗎?還是必須遍歷所有對象並找到唯一的狀態值?

+0

你可以循環它們。或者,如果這是一種常見的訪問模式,想出一個比列表更好的方式來存儲數據。 – 2012-03-03 14:58:18

回答

6

是的,你必須循環。唯一值的最佳集合是一組的,但如果你真的想要一個列表或數組,可以隨時變換分析設置算賬:

Set<String> statesAsSet = new HashSet<String>(); 
for (Person p : persons) { 
    statesAsSet.add(p.getState()); 
} 

// if yo want a list: 
List<String> statesAsList = new ArrayList<String>(statesAsSet); 
// if you want an array: 
String[] statesAsArray = statesAsSet.toArray(new String[statesAsSet.size()]); 

你應該閱讀Java collections tutorial。這是一個必須知道的。

1
  1. 在您的Personal類中實現equals
  2. Create a Set, from the List
  3. Convert the set back to List

我知道你只是循環和比較,並在其他答覆中提到做的東西。我只是提到了不涉及循環的方法。

+0

10這不必要地改變了'Person'類的相等語義,我建議創建一組新的狀態。 – 2012-03-03 15:00:06

1

的「功能性」的方式與番石榴(谷歌集合)要做到這一點可能是這樣的:

Set<State> uniqueStates = Sets.newHashSet(
    Iterables.transform(persons, new Function<Person, State>() { 
    @Override public State apply(Person person) { 
     return person.getState(); 
    } 
    )); 
1

的問題已經是很久以前的回答。對於將來使用Java 8或更高版本的讀者,可以使用Streams API從person列表中查找所有唯一的state值。

List<String> uniqueStates = persons.stream() 
      .map(Person::getState) 
      .distinct() 
      .collect(toList()); 

這裏需要注意的關鍵是distinct()操作。來自java文檔:

返回由此流的不同元素(根據Object.equals(Object))組成的流。

相關問題