java在列表中查找具有唯一属性的对象

时间:2012-03-03 14:50:59

标签: 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是否提供此功能?或者我是否必须遍历所有对象并找到唯一的状态值?

4 个答案:

答案 0 :(得分:6)

是的,你必须循环。唯一值的最佳集合是Set,但如果您真的需要List或数组,则可以随后转换Set:

 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)

  1. Personal课程中实施equals
  2. Create a Set, from the List
  3. Convert the set back to List
  4. 我知道你可以循环和比较并做其他答案中提到的东西。我只是提到了不涉及循环的方法。

答案 2 :(得分:1)

使用Guava(Google Collections)执行此操作的“功能”方式可能是这样的:

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

答案 3 :(得分:1)

很久以前就回答了这个问题。对于使用Java 8或更高版本的未来读者,您可以使用Streams API查找state列表中的所有唯一person值。

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

这里要注意的关键是distinct()操作。来自java docs:

  

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