Есть класс:
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;
}
Мне в целом нужна общая идея.
Вам нужно реализовать алгоритм последовательного поиска:
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());
Как-то так...
Можно использовать 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 + '}';
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Всем приветПодскажите, как из двух оставшихся объектов после первого фильтра(по длине имени): Bruce & Jackie, вывести один с наибольшим возрастом(Jackie)
Спроектируйте класс Cat с любыми полями, но таким образом, чтобы для него были доступны следующие методы:
Здравствуйте! Вопрос касается связи между компонентами React,а именно: передача данных из одного компонента в другой