在包含前缀的集合中查找条目
Finding entries in a Set containing a prefix
作为 Java 初学者,我正在做一些练习,但我无法让它发挥作用。
这就是我正在使用的:
public static Set<Person> prefixName(final Set<Person> persons, final String prefix) {
...
}
集合由名称组成,而前缀是名称的子串(或不是)。因此,对于 persons = {Larry, Dave, Laura},
prefix = La
,该方法将 return {Larry, Laura}
我向我的一个好友寻求帮助,他说要查看流。由于我正在使用的书还没有提到任何流,我相信也有一个更简单、对初学者更友好的解决方案!
This 基本上是同一个问题,但是有一个 TreeSet,它显然有一个非常方便的方法来解决这个问题。
通用集不能利用知道前缀来查找元素。您将需要遍历整个集合并检查每个条目。
A TreeSet
但是 可以利用 的知识作为条目 按其前缀排序 。为了找到所有前缀,您只需要将整个子树都以前缀为根,这可以快速计算。
这是一个 TreeSet
:
的内部结构图
这是明显的天真实现:
public static Set<Person> prefixName(final Set<Person> persons, final String prefix) {
final Set<Person> personsWithPrefix = new HashSet<>();
for (final Person person : persons) {
if (person.getName().startsWith(prefix)) {
personsWithPrefix.add(person);
}
}
return personsWithPrefix;
}
或者更紧凑的 Java 8 使用流的解决方案:
public static Set<Person> prefixName(final Set<Person> persons, final String prefix) {
return persons.stream()
.filter(person -> person.getName().startsWith(prefix))
.collect(Collectors.toSet());
}
作为 Java 初学者,我正在做一些练习,但我无法让它发挥作用。
这就是我正在使用的:
public static Set<Person> prefixName(final Set<Person> persons, final String prefix) {
...
}
集合由名称组成,而前缀是名称的子串(或不是)。因此,对于 persons = {Larry, Dave, Laura},
prefix = La
,该方法将 return {Larry, Laura}
我向我的一个好友寻求帮助,他说要查看流。由于我正在使用的书还没有提到任何流,我相信也有一个更简单、对初学者更友好的解决方案!
This 基本上是同一个问题,但是有一个 TreeSet,它显然有一个非常方便的方法来解决这个问题。
通用集不能利用知道前缀来查找元素。您将需要遍历整个集合并检查每个条目。
A TreeSet
但是 可以利用 的知识作为条目 按其前缀排序 。为了找到所有前缀,您只需要将整个子树都以前缀为根,这可以快速计算。
这是一个 TreeSet
:
这是明显的天真实现:
public static Set<Person> prefixName(final Set<Person> persons, final String prefix) {
final Set<Person> personsWithPrefix = new HashSet<>();
for (final Person person : persons) {
if (person.getName().startsWith(prefix)) {
personsWithPrefix.add(person);
}
}
return personsWithPrefix;
}
或者更紧凑的 Java 8 使用流的解决方案:
public static Set<Person> prefixName(final Set<Person> persons, final String prefix) {
return persons.stream()
.filter(person -> person.getName().startsWith(prefix))
.collect(Collectors.toSet());
}