2012-03-03 67 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))组成的流。

相关问题