gpt4 book ai didi

java - 如何检查一个列表的对象是否包含另一个列表的任何对象

转载 作者:行者123 更新时间:2023-12-01 14:31:53 25 4
gpt4 key购买 nike

我们有两个列表,一个是问题类型,另一个是标签类型。

Question 类具有那些属性

private String id;
private String header;
private String content;
private List<Tag> tags;
private Long timeStamp;

问题列表包含所有问题,标签列表包含所有标签。我们想检查一个问题是否包含标签列表中的任何标签。我想对所有问题都这样做。

通过 question.getTags,我得到了标签列表。

Tag 类有一个名为 counter 的属性。

我将给出一些伪代码来实际向您展示我想做什么

List<Tag> allTags = ...
List<Question> allQuestions = ...
Map<Tag,Integer> map = new Hashmap<>();

if(one question contains any tag of allTags) {
tag.setCounter(counter+1);
map.put(tag,tag.getCounter);
}

最后我想要一个 map ,其中键是标签,值是该标签的计数器。

我怎样才能真正做到这一点?

编辑这里是我的 Tag.java

@NoArgsConstructor
@Data
@Getter
@AllArgsConstructor
@Setter
@Document(collection = "tag")
public class Tag {
private String id;
private String name;
private Long timeStamp;

public Tag(String name) {
this.id = UUID.randomUUID().toString();
this.name = name;
this.timeStamp = Instant.now().getEpochSecond()*1000;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tag tag = (Tag) o;
return Objects.equals(getId(), tag.getId());
}

@Override
public int hashCode() {
return Objects.hash(getId());
}
}

最佳答案

我认为 Tag 类中的计数器属性用于计算 Tagquestions 列表中出现的频率是一个设计错误。你在那里不需要这样的柜台。

一个可能合理的示例:假设您有一个类 Student 和一个类 Course。要跟踪类(class)中有多少学生,Student 类中不需要计数器。同样,Tag 类应该只包含标签的属性。也就是说,您可以使用以下两种方法之一在没有计数器的情况下实现您的目标(前提是您有 java 8 或更高版本并且您的 Tag 类覆盖 equals哈希码方法):

使用 StreamsCollectors.groupingBy 的方法 1>

Map<Tag,Long> map = allQuestions.stream()
.flatMap(q -> q.getTags().stream())
.filter(allTags::contains)
.collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));

方法 2 使用 List.forEach & Map.compute

Map<Tag, Integer> map2 = new HashMap<>();
allQuestions.forEach(q -> {
q.getTags()
.stream()
.filter(allTags::contains)
.forEach(t -> map2.compute(t, (k, v) -> v == null ? 1 : v + 1));
});

或者使用传统的for-loopif-else block

Map<Tag, Integer> map3 = new HashMap<>();

for (Question q : allQuestions) {
for (Tag t : q.getTags()) {
if (allTags.contains(t)) {
if (map3.containsKey(t)) {
map3.put(t, map3.get(t) + 1);
} else {
map3.put(t, 1);
}
}
}
}

关于java - 如何检查一个列表的对象是否包含另一个列表的任何对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62459764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com