我有两个类的结构如下:
public class Company {
private List<Person> person;
...
public List<Person> getPerson() {
return person;
}
...
}
public class Person {
private String tag;
...
public String getTag() {
return tag;
}
...
}
基本上,Company类有一个Person对象列表,每个Person对象都可以获得一个标记值。
如果我得到Person对象的列表,有没有一种方法可以使用Java8中的Stream来查找所有Person对象中最常见的一个标记值(如果是并列的,可能只是最常见的一个随机标记)?
String mostCommonTag;
if(!company.getPerson().isEmpty) {
mostCommonTag = company.getPerson().stream() //How to do this in Stream?
}
这应该适合您:
private void run() {
List<Person> list = Arrays.asList(() -> "foo", () -> "foo", () -> "foo",
() -> "bar", () -> "bar");
Map<String, Long> commonness = list.stream()
.collect(Collectors.groupingBy(Person::getTag, Collectors.counting()));
Optional<String> mostCommon = commonness.entrySet().stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getKey);
System.out.println(mostCommon.orElse("no elements in list"));
}
public interface Person {
String getTag();
}
commonness
地图包含找到哪个标签的频率信息。变量mostCommon
包含最常找到的标记。此外,如果原始列表为空,mostCommon
也为空。
您可以将计数收集到地图上,然后获取具有最高值的密钥
List<String> foo = Arrays.asList("a","b","c","d","e","e","e","f","f","f","g");
Map<String, Long> f = foo
.stream()
.collect(Collectors.groupingBy(v -> v, Collectors.counting()));
String maxOccurence =
Collections.max(f.entrySet(), Comparator.comparing(Map.Entry::getValue)).getKey();
System.out.println(maxOccurence);
String mostCommonTag = getPerson().stream()
// filter some person without a tag out
.filter(it -> Objects.nonNull(it.getTag()))
// summarize tags
.collect(Collectors.groupingBy(Person::getTag, Collectors.counting()))
// fetch the max entry
.entrySet().stream().max(Map.Entry.comparingByValue())
// map to tag
.map(Map.Entry::getKey).orElse(null);
而getTag
方法出现了两次,您可以进一步简化代码:
String mostCommonTag = getPerson().stream()
// map person to tag & filter null tag out
.map(Person::getTag).filter(Objects::nonNull)
// summarize tags
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
// fetch the max entry
.entrySet().stream().max(Map.Entry.comparingByValue())
// map to tag
.map(Map.Entry::getKey).orElse(null);
我正在尝试编写一个方法,该方法可以在列表列表中找到对象的索引并利用并行性。这是我的代码。 当我运行以下代码时 输出类似于 换句话说,即使在找到对象之后,搜索仍在继续。不应该是短路操作吗?我错过了什么?此外,在迭代列表或锯齿数组时,利用并行性的最佳方法是什么? 编辑 按照@Sotirios回答中的想法,我得到了以下输出 请注意 即使找到答案也继续搜索。
问题内容: 在Python列表中查找最常见元素的有效方法是什么? 我的列表项可能无法散列,因此无法使用字典。同样在绘制的情况下,应返回索引最低的项目。例: 问题答案: 提出了这么多解决方案,令我惊讶的是没有人提出我认为显而易见的解决方案(对于不可哈希但可比较的元素)-。 提供快速,可重用的功能,并允许你将一些棘手的逻辑委托给经过良好测试的标准库组件。考虑例如: 当然,这可以写得更简洁一些,但我的目
问题内容: 我有看起来像这样的数据: 我想要一个函数,该函数根据我选择的movie_id返回注释中最常用的词。因此,如果我查询movie_id = 1,则会得到: 如果我查询movie_id = 2,则会得到: 我看到了一些使用tsql的解决方案,但我以前从未使用过,也不了解代码。寻找一种在sqlite3中做到这一点的方法。 问题答案: 您可以使用一个非常丑陋的查询来执行此操作。 这是未经测试的。
问题内容: 我正在寻找一种非常快速,干净且有效的方法来获取以下JSON切片中的最大“ y”值: for-loop是解决此问题的唯一方法吗?我热衷于使用。 问题答案: 要在中找到对象的最大值:
本文向大家介绍在Python的2D列表中查找最常见的元素,包括了在Python的2D列表中查找最常见的元素的使用技巧和注意事项,需要的朋友参考一下 2D列表具有列表作为其元素。换句话说,它是一个列表列表。在本文中,我们需要找到列表中所有列表中最常见的元素。 随着最大和计数 我们设计一个条件为in的跟随项,以检查给定子列表中元素的存在。然后,我们将max函数与count函数一起使用以获取具有最大频率
问题内容: 我在python中有一个 统一 的对象列表: 现在,我想提取一个具有该类某些属性的列表(比如attr),以便将其传递给某个函数(例如用于绘制该数据) pythonic的做法是什么, ? 也许派生列表并添加一个方法,所以我可以使用一些习惯用法,例如 ? 问题答案: 您还可以编写: 这样,您将获得一个节省内存的生成器。有关更多好处,请参见Generator Expressions 。