比较string [[]数组和一组对象。并返回重复的设置

时间:2019-02-21 13:48:01

标签: java java-8

我想将字符串数组与对象集进行比较,其中对象具有字符串字段。然后返回等于给定字符串的对象。但是我想尽可能避免每个循环。

任何想法我该如何使用流api?

所以让我粘贴一些示例代码:

    class TestObj {

    private String str;
    private String name;

    public TestObj(String str, String name) {
        this.setStr(str);
        this.setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

}

实际的代码是:

    Set<TestObj> allObjects = new HashSet<>();
    allObjects.add(new TestObj("s", "aaa"));
    allObjects.add(new TestObj("d", "uuu"));
    allObjects.add(new TestObj("a", "ggg"));
    allObjects.add(new TestObj("c", "dd"));

    String[] arr = {"a", "b", "e", "f"};

    Set<TestObj> objectsToReturn = new HashSet<>();


    for (String string : arr) {
        for (TestObj testObj : objectsToReturn) {
            if(string.equals(testObj.getStr())) {
                objectsToReturn.add(testObj);
            }
        }
    }

2 个答案:

答案 0 :(得分:3)

我首先要强调的是,在每个循环中使用都没错。使用流甚至可能会带来一些开销。

也就是说,对流进行处理的一种方法是:

String[] arr = {"a", "b", "e", "f"};
List<String> arrList = Arrays.asList(arr); // create a List from the array so that we can call "contains".
                                           // If the array is constant, you should just directly create a List instead.

Set<TestObj> objectsToReturn =
        allObjects.stream()
        .filter(x -> arrList.contains(x.getStr()))
        .collect(Collectors.toSet());

如果数组已排序,则不需要List,可以调用binarySearch来查看数组是否包含元素:

Set<TestObj> objectsToReturn =
        allObjects.stream()
        .filter(x -> Arrays.binarySearch(arr, x.getStr()) >= 0)
        .collect(Collectors.toSet());

答案 1 :(得分:-2)

您正在将字符串与错误的对象进行比较。在内部for-each循环中,您正在循环访问ObjectToReturn,该对象为空。要解决此问题,只需更改:

for (TestObj testObj : objectsToReturn) {

收件人:

for (TestObj testObj : allObjects) {