Сравнить строку] [] массив с набором объектов.И вернуть набор с дублированными - PullRequest
0 голосов
/ 21 февраля 2019

Я бы хотел сравнить массив строк с множеством объектов, где объект имеет строковое поле.А затем вернуть объект, который равен данной строке.Но я хотел бы по возможности избегать для каждого цикла.

Любая идея, как я могу сделать это с потоком 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 голосов
/ 21 февраля 2019

Вы сравниваете строки с неправильными объектами.Во внутреннем цикле for-each вы перебираете ObjectToReturn, который пуст.Чтобы исправить это просто измените:

for (TestObj testObj : objectsToReturn) {

на:

for (TestObj testObj : allObjects) {
0 голосов
/ 21 февраля 2019

Я хотел бы сначала подчеркнуть, что нет ничего плохого с этим для каждого цикла.Использование потоков может даже привести к некоторым издержкам.

Тем не менее, один из способов сделать это с потоками:

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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...