我有以下形式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提供此功能吗?还是必须遍历所有对象并找到唯一的状态值?
我有以下形式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提供此功能吗?还是必须遍历所有对象并找到唯一的状态值?
是的,你必须循环。唯一值的最佳集合是一组的,但如果你真的想要一个列表或数组,可以随时变换分析设置算账:
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。这是一个必须知道的。
Personal
类中实现equals
。Set
, from the List
List
我知道你只是循环和比较,并在其他答复中提到做的东西。我只是提到了不涉及循环的方法。
10这不必要地改变了'Person'类的相等语义,我建议创建一组新的状态。 – 2012-03-03 15:00:06
的“功能性”的方式与番石榴(谷歌集合)要做到这一点可能是这样的:
Set<State> uniqueStates = Sets.newHashSet(
Iterables.transform(persons, new Function<Person, State>() {
@Override public State apply(Person person) {
return person.getState();
}
));
的问题已经是很久以前的回答。对于将来使用Java 8或更高版本的读者,可以使用Streams API从person
列表中查找所有唯一的state
值。
List<String> uniqueStates = persons.stream()
.map(Person::getState)
.distinct()
.collect(toList());
这里需要注意的关键是distinct()
操作。来自java文档:
返回由此流的不同元素(根据Object.equals(Object))组成的流。
你可以循环它们。或者,如果这是一种常见的访问模式,想出一个比列表更好的方式来存储数据。 – 2012-03-03 14:58:18