Найти объект в ArrayList по нескольким полям

88
29 мая 2021, 12:30

Есть класс:

public class myTT {
    private Integer uid;
    private Integer Xline;
    private Integer nuid;
    private String name;
    public myTT(int uid, int Xline, String name, int nuid) {
        this.name = name;
        this.Xline = Xline;
        this.uid = uid;
        this.nuid = nuid;
    }
    public int getNuid() {
        return nuid;
    }
    public int getUid() {
        return uid;
    }
    public int getXline() {
        return Xline;
    }
    public String getName() {
        return name;
    }
}

В Main я создаю ArrayList, содержащий объекты этого класса:

public class Main {
    public static void main(String[] args) {
        ArrayList<myTT> searchList = new ArrayList<>();
        myTT test0 = new myTT(1, 0, "Uid=1, X=0, nuid=0", 0);
        myTT test1 = new myTT(2, 1, "Uid=2, X=1, nuid=0", 0);
        myTT test2 = new myTT(3, 0, "Uid=3, X=0, nuid=1", 1);
        myTT test3 = new myTT(4, 1, "Uid=4, X=1, nuid=2", 2);
        myTT test4 = new myTT(5, 1, "Uid=5, X=0, nuid=4", 4);
        myTT test5 = new myTT(6, 0, "Uid=6, X=0, nuid=3", 3);
        searchList.add(test0);
        searchList.add(test1);
        searchList.add(test2);
        searchList.add(test3);
        searchList.add(test4);
        searchList.add(test5);
    }
}

Как мне организовать поиск по ArrayList, так чтобы можно было найти элемент по двум полям сразу, т. е. примерно так:

public myTT searchInArrList(int XLine, int nuid) {
    myTT obj;
    //do something
    return obj;
}

Мне в целом нужна общая идея.

Answer 1

Вам нужно реализовать алгоритм последовательного поиска:

myTT finded;
for(myTT test : searchList){
    if((test.field1 == a) && (test.field2 == b)){
        finded = test;
        break;
    }
}

Или через лямбда-выражение:

myTT finded = searchList
                  .stream()
                  .filter(test -> ((test.field1 == a) && (test.field2 == b))
                  .findFirst()
                  .orElse(null);

Если нужно найти несколько элементов:

ArrayList<myTT> findedList = new ArrayList();
for(myTT test : searchList){
    if((test.field1 == a) && (test.field2 == b)){
        findedList.add(test);
    }
}

Или:

ArrayList<myTT> findedList = searchList
                  .stream()
                  .filter(test -> ((test.field1 == a) && (test.field2 == b))
                  .collect(Collectors.toList());

Как-то так...

Answer 2

Можно использовать filter из Java Stream API для отбора по нескольким полям:

List<SomeClass> list1 = new ArrayList<>();
list1.add(new SomeClass(1, "str1"));
list1.add(new SomeClass(2, "str2"));
list1.add(new SomeClass(3, "str3"));
List<SomeClass> list2 = list1.stream()
        // условия могут быть любыми,
        // например, кроме второго элемента
        .filter(e -> e.getField1() != 2 && !e.getField2().equals("str2"))
        .collect(Collectors.toList());
System.out.println(list2); // [{1, str1}, {3, str3}]
list1.stream()
        // можно использовать цепочку фильтров,
        // например, только второй элемент
        .filter(e -> e.getField1() == 2)
        .filter(e -> e.getField2().equals("str2"))
        // можно не собирать элементы
        // в новый лист, а сразу
        // выполнять действия над ними
        .forEach(e -> {
            System.out.println(e); // {2, str2}
        });

Для этого примера в классе SomeClass должны быть: конструктор, геттеры и метод toString.

class SomeClass {
    int field1;
    String field2;
    public SomeClass(int field1, String field2) {
        this.field1 = field1;
        this.field2 = field2;
    }
    public int getField1() { return field1; }
    public String getField2() { return field2; }
    @Override
    public String toString() {
        return "{" + field1 + ", " + field2 + '}';
    }
}
READ ALSO
XmlMapper не видит значение SOAP

XmlMapper не видит значение SOAP

есть респонсе soap

192
Найти максимальное значение в потоке

Найти максимальное значение в потоке

Всем приветПодскажите, как из двух оставшихся объектов после первого фильтра(по длине имени): Bruce & Jackie, вывести один с наибольшим возрастом(Jackie)

97
Инкапсуляция кота

Инкапсуляция кота

Спроектируйте класс Cat с любыми полями, но таким образом, чтобы для него были доступны следующие методы:

96
Межкомпонентная связь React: как передавать данные между компонентами?

Межкомпонентная связь React: как передавать данные между компонентами?

Здравствуйте! Вопрос касается связи между компонентами React,а именно: передача данных из одного компонента в другой

218