当前位置: 首页 > 知识库问答 >
问题:

如何在java中过滤具有公共属性值的嵌套列表列表

叶修永
2023-03-14

在测试类下面,我想过滤所有部分中的公共语言列表。

例如,测试有药剂列表P1和P2。P1有一个列表

最终输出应该是包含Ja和Zh语言的语言对象列表。

class Test{
List<Portion> portions
}

class Portion{
List<Language> languages
}

class Language {
 String name;
 String code;
}

共有3个答案

经国安
2023-03-14

您可以使用hashmap(存储每种语言的频率)并重写hashcode和equals方法

算法如何工作:

  1. 遍历所有部分
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);
    }

}

焦阎宝
2023-03-14

你需要使用平面图。如果您不需要删除重复项,下面是解决方案。

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();
    }
}

}

范高刚
2023-03-14

在如下语言类中重写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