在测试类下面,我想过滤所有部分中的公共语言列表。
例如,测试有药剂列表P1和P2。P1有一个列表
最终输出应该是包含Ja和Zh语言的语言对象列表。
class Test{
List<Portion> portions
}
class Portion{
List<Language> languages
}
class Language {
String name;
String code;
}
您可以使用hashmap(存储每种语言的频率)并重写hashcode和equals方法
算法如何工作:
import java.util.*;
public class CustomFilter {
public static void main(String args[]) {
List<Portion> portions = Arrays.asList(
new Portion(
Arrays.asList(
new Language("English", "en"),
new Language("Japanese", "Ja"),
new Language("Chinese", "Zh"))),
new Portion(
Arrays.asList(
new Language("Japanese", "Ja"),
new Language("Chinese", "Zh"))));
HashMap<Language, Integer> languageFreqMap = new HashMap<>();
for (Portion portion : portions)
for (Language language : portion.languages)
languageFreqMap.put(language, languageFreqMap.getOrDefault(language, 0) + 1);
List<Language> commonLanguages = new ArrayList<>();
for (Map.Entry<Language, Integer> entry : languageFreqMap.entrySet())
if (entry.getValue() == portions.size())
commonLanguages.add(entry.getKey());
System.out.println(commonLanguages);
}
}
class Test {
List<Portion> portions;
public Test(List<Portion> portions) {
this.portions = portions;
}
}
class Portion {
List<Language> languages;
public Portion(List<Language> languages) {
this.languages = languages;
}
}
class Language {
String name;
String code;
public Language(String name, String code) {
this.name = name;
this.code = code;
}
@Override
public String toString() {
return "{" +
" name='" + name + "'" +
", code='" + code + "'" +
"}";
}
@Override
public boolean equals(Object o) {
Language lang = (Language) o;
return this.code.equals(lang.code);
}
@Override
public int hashCode() {
return Objects.hash(name, code);
}
}
你需要使用平面图。如果您不需要删除重复项,下面是解决方案。
public class Stream_FlatMap {
public static void main(String[] args) {
Language lang11 = new Language("English", "en");
Language lang12 = new Language("Japanese", "Ja");
Language lang13 = new Language("Chinese", "Zh");
List<Language> languages1 = new ArrayList<>();
languages1.add(lang11);
languages1.add(lang12);
languages1.add(lang13);
Portion portion1 = new Portion(languages1);
Language lang21 = new Language("Japanese", "Ja");
Language lang22 = new Language("Chinese", "Zh");
Language lang23 = new Language("Chinese11", "Zh1");
List<Language> languages2 = new ArrayList<>();
languages2.add(lang21);
languages2.add(lang22);
Portion portion2 = new Portion(languages2);
List<Portion> portions = new ArrayList<>();
portions.add(portion1);
portions.add(portion2);
Test t = new Test(portions);
List<Language> languages = t.portions.stream().flatMap(p -> {
return p.languages.stream().filter(l -> (l.code.equals("Ja") || l.code.equals("Zh")));
}).collect(Collectors.toList());
languages.stream().forEach(t1 -> System.out.println(t1));
}
static class Test {
public Test(List<Portion> portions) {
this.portions = portions;
}
public List<Portion> portions;
}
static class Portion {
public Portion(List<Language> languages) {
this.languages = languages;
}
public List<Language> languages;
}
static class Language {
public Language(String name, String code) {
this.name = name;
this.code = code;
}
public String name;
public String code;
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Language{");
sb.append("name='").append(name).append('\'');
sb.append(", code='").append(code).append('\'');
sb.append('}');
return sb.toString();
}
}
}
在如下语言类中重写equals()
class Language {
public String name;
public String code;
@Override
public boolean equals(Object obj) {
return this.name.equals(((Language) obj).name) && this.code.equals(((Language) obj).code);
}
}
现在只管做
Portion p1 = test.get(0);
Portion p1 = test.get(1);
List<Language> duplicate = p1.languages.stream()
.filter(lan1 -> p2.languages.stream()
.anyMatch(lan2 -> lan1.equals(lan2)))
.collect(Collectors.toList());
您将在duplicate
列表中获得重复的结果。
以下是测试代码:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Test {
public static void main(String args[]) {
List<Portion> portions = new ArrayList<Portion>();
Language l1 = new Language();
l1.code = "en";
l1.name = "English";
Language l2 = new Language();
l2.code = "Ja";
l2.name = "Japanese";
Language l3 = new Language();
l3.code = "Ch";
l3.name = "Chinese";
Language l4 = new Language();
l4.code = "Ja";
l4.name = "Japanese";
Language l5 = new Language();
l5.code = "Ch";
l5.name = "Chinese";
List<Language> languages1 = new ArrayList<>();
languages1.add(l1);
languages1.add(l2);
languages1.add(l3);
List<Language> languages2 = new ArrayList<>();
languages2.add(l4);
languages2.add(l5);
Portion p1 = new Portion();
Portion p2 = new Portion();
p1.languages = languages1;
p2.languages = languages2;
List<Language> duplicates = p1.languages.stream()
.filter(lan1 -> p2.languages.stream()
.anyMatch(lan2 -> lan1.equals(lan2)))
.collect(Collectors.toList());
System.out.println(duplicates);
System.out.println("Result 1 : " + duplicates.get(0).code + " " + duplicates.get(0).name);
System.out.println("Result 2 : " + duplicates.get(1).code + " " + duplicates.get(1).name);
}
}
class Portion{
public List<Language> languages = new ArrayList<Language>();
}
class Language {
public String name;
public String code;
@Override
public boolean equals(Object obj) {
return this.name.equals(((Language) obj).name) && this.code.equals(((Language) obj).code);
}
}
在测试类下面,我想过滤所有部分中的公共语言列表。 例如,测试有药剂列表P1和P2。P1有一个列表 最终输出应该是具有语言Ja和Zh的语言对象列表。
基于 那个东西的 以下是我目前所尝试的: 我想使用一个Java8流和两个getter的lambdas来完成这一操作,这两个getter最终检索用于确定唯一性的属性,但不确定如何实现。当用于比较的属性位于pojo的顶层时,我知道如何做,但当属性嵌套在另一个对象中时,我不知道如何做。
问题内容: 这是我的表(简体,仅重要的列): 以及一些样本数据: 我想选择键下任意位置的行。像这样的东西: 数据完全像样本中一样嵌套(仅一层)。 当前,我们正在使用PostgreSQL 9.3.5。 在PostgreSQL 9.3中可以吗?也许是9.4? 问题答案: 您的查询已关闭。 是关键功能。还是为了。进行了一些改进: 旧的sqlfiddle db <> fiddle在这里 已经返回该值作为数
我有一个类似这样的组对象 和如下所示的Item对象
我正在尝试过滤scala中对象列表的列表属性。例如: 用java定义的类 我的过滤器函数返回字符串列表而不是结果列表 UPDATE我想取回listOf中的所有结果,其中每个结果的名称属性被过滤。
问题内容: index.js index.html 它给了我完美的表,但问题出在一栏中。我有数据列表,并想创建具有所有List值的嵌套表。 我该如何实现?要检查是否有列具有列表(如果是),然后生成嵌套表。检查这个矮人http://plnkr.co/edit/Ixvp8B0dRwOBDHflmu2j?p=preview 问题答案: 您可以这样编写标记: 完整代码:https : //gist.git