powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск строки в массивах которые вложены друг в друга - красивое решеение?
25 сообщений из 36, страница 1 из 2
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472284
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, а подскажите, кто как бы решил наиболее красивым способом сл штуку. Я понимаю, что так не делается но, сейчас так нужно.
Начал делать в лоб, но три цыкла и в каждоим несколько ИФ, меня как-то смущает...
Значит есть три массива с объектами, в каждом объекте есть поле по которому нужно поискать. Все массивы вложены друг в друга.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
String serachedWord = "bu"

List<IssuerExportsWrapper> exports;

public class IssuerExportsWrapper
{
   public Long id = null;
   public String name = null;
   public List<ContactExportsWrapper> allContactExports = new ArrayList<>();
}

public class ContactExportsWrapper
{
   public Long contactId;
   public String contactName;
   public List<ExportWrapper> allExportsForContact = new ArrayList<>();
}

public class ExportWrapper
{
   public Long id;
   public Long issuerId;
   public String filename;
}



Так вот нужно искать по name, contactName и filename
При этом паковать в результат только те объекты в которых
Код: java
1.
name.toLowerCase().equalsIgnoreCase(serachedWord) || contactName.toLowerCase().equalsIgnoreCase(serachedWord) || filename.toLowerCase().equalsIgnoreCase(serachedWord)



Я не прошу сделать это за меня, просто у меня пока решение только одно итерировать и ифами проверять. Но это получится монструозная фенкция и некрасивая.

Спасибо.
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472293
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
name к интерфейсу привести нельзя?
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472304
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczname к интерфейсу привести нельзя? - Немного не понял Вас, названия полей менять не желательно, Обратно нужно отправлять такую же структуру.
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472307
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_,

Да, что ж это такое, что уже и интерфейсы объяснять приходится...

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class IssuerExportsWrapper implements Named {
    public String name() {return name;}
}

public class ContactExportsWrapper implements Named {
    public String name() {return contactName;}
}
 
public class ExportWrapper implements Named {
    public String name() {return fileName;}
}
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472313
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczДа, что ж это такое, что уже и интерфейсы объяснять приходится... - Да нет, я просто не очень понял Вашего высказывания.
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472332
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
        List<IssuerExportsWrapper>;
        String query = "bu";

        List<Object> result = Stream.concat(Stream.concat(
                        exports.stream()
                                .flatMap(i -> i.allContactExports.stream())
                                .flatMap(c -> c.allExportsForContact.stream())
                                .filter(e -> e.filename.equalsIgnoreCase(query)),

                        exports.stream()
                                .flatMap(issuer -> issuer.allContactExports.stream())
                                .filter(c -> c.contactName.equalsIgnoreCase(query))
                ),
                exports.stream()
                        .filter(i -> i.name.equalsIgnoreCase(query))).collect(Collectors.toList())
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472333
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, но интерфейсы меня не освободят от итерирования через все три массива. И проверки, какой объект к какому массиву принадлежит. Например начинаем итерировать в первом массиве не совпадение, в втором вложенном тоже, в третьем есть совпадение с fileName. Мне тогда нужно проверить, есть ли у меня уже объект из первого массива и второго...
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472334
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_Да нет, я просто не очень понял Вашего высказывания.
И поэтому решил проигнорировать вопрос полностью.
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472349
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На интерфейсах выходит больше кода :(

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
    interface NamedLookupObjectWithChildren {
        String name();
        Stream<? extends NamedLookupObjectWithChildren> flatter();
    }

    public class IssuerExportsWrapper implements NamedLookupObjectWithChildren {
        public Long id = null;
        public String name = null;
        public List<ContactExportsWrapper> allContactExports = new ArrayList<>();

        @Override
        public String name() {
            return name;
        }

        @Override
        public Stream<? extends NamedLookupObjectWithChildren> flatter() {
            return Stream.concat(
                    Stream.of(this),
                    allContactExports.stream());
        }
    }

    public class ContactExportsWrapper implements NamedLookupObjectWithChildren {
        public Long contactId;
        public String contactName;
        public List<ExportWrapper> allExportsForContact = new ArrayList<>();

        @Override
        public String name() {
            return contactName;
        }

        @Override
        public Stream<? extends NamedLookupObjectWithChildren> flatter() {
            return Stream.concat(
                    Stream.of(this),
                    allExportsForContact.stream());
        }
    }

    public class ExportWrapper implements NamedLookupObjectWithChildren {
        public Long id;
        public Long issuerId;
        public String filename;

        @Override
        public String name() {
            return filename;
        }

        @Override
        public Stream<? extends NamedLookupObjectWithChildren> flatter() {
            return Stream.of(this);
        }
    }


        List<IssuerExportsWrapper> exports = new ArrayList<>();
        String query = "bu";

        Stream<? extends NamedLookupObjectWithChildren> stream = exports.stream();
        int HIERARCHY_DEPTH = 3;
        for (int i = 0; i < HIERARCHY_DEPTH; i++) {
            stream = stream.flatMap(NamedLookupObjectWithChildren::flatter);
        }

        stream.filter(o -> query.equals(o.name()));
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472356
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_Так вот нужно искать по name, contactName и filename
При этом паковать в результат только те объекты в которых
Код: java
1.
name.toLowerCase().equalsIgnoreCase(serachedWord) || contactName.toLowerCase().equalsIgnoreCase(serachedWord) || filename.toLowerCase().equalsIgnoreCase(serachedWord)



Поскольку у Вас три списка с поиском по совпадению в любом, т либо полное сканирование,
Либо заменяете свои списки на структуру, которая отчитывается тем или другим способом корню структуры о вхождении имени, а в нем уже делаете кеш на каком-нибудь дереве.
Замедляется вставка, но ускоряется поиск. :)
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472365
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz
Код: java
1.
2.
3.
4.
5.
for (int i = 0; i < HIERARCHY_DEPTH; i++) {
            stream = stream.flatMap(NamedLookupObjectWithChildren::flatter);
        }

        stream.filter(o -> query.equals(o.name()));

- Почему, немного. Круто.
Мне очень нравится решение.
Код: java
1.
2.
3.
4.
5.
for (int i = 0; i < HIERARCHY_DEPTH; i++) {
            stream = stream.flatMap(NamedLookupObjectWithChildren::flatter);
        }

        stream.filter(o -> query.equals(o.name()));



даже не знал, что можно вот так вот все массивы вот так вот в один стрим засунуть и потом фильтровать.
В любом случае это решение элегантней чем то о ктором я думал "в лоб" с итерациями и ифами.

Спасибо! Сейчас испробую.
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472387
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_- Почему, немного. Круто.
Мне очень нравится решение.

Мне не нравится. Я подозреваю что там есть косяк с тем что одни и те же элементы будут разворачиваться.
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472401
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz_webdev_- Почему, немного. Круто.
Мне очень нравится решение.

Мне не нравится. Я подозреваю что там есть косяк с тем что одни и те же элементы будут разворачиваться.

Кста, не фильтрует, я так подозреваю, нужно стрим в массив переконвертировать который был на входе, а просто Collect.toList не сделать, так как не примитывный тип..
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472403
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
public static final String serachedWord = "bu";

public static class IssuerExportsWrapper {
    
    public String name;
    
    public IssuerExportsWrapper(String name) {
        this.name = name;
    }
    
    @Override
    public boolean equals(Object obj) {
        return name.equalsIgnoreCase(((IssuerExportsWrapper)obj).name);
    }
}

public static void main(String[] args) throws Exception {
    List<IssuerExportsWrapper> a = new ArrayList<>();
    a.add(new IssuerExportsWrapper("au")); 
    a.add(new IssuerExportsWrapper("bu")); 
    a.add(new IssuerExportsWrapper("cu"));
    
    System.out.println(a.contains(new IssuerExportsWrapper(serachedWord)));
    System.out.println(a.indexOf(new IssuerExportsWrapper(serachedWord)));
}
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472408
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman_webdev_,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
public static final String serachedWord = "bu";

public static class IssuerExportsWrapper {
    
    public String name;
    
    public IssuerExportsWrapper(String name) {
        this.name = name;
    }
    
    @Override
    public boolean equals(Object obj) {
        return name.equalsIgnoreCase(((IssuerExportsWrapper)obj).name);
    }
}

public static void main(String[] args) throws Exception {
    List<IssuerExportsWrapper> a = new ArrayList<>();
    a.add(new IssuerExportsWrapper("au")); 
    a.add(new IssuerExportsWrapper("bu")); 
    a.add(new IssuerExportsWrapper("cu"));
    
    System.out.println(a.contains(new IssuerExportsWrapper(serachedWord)));
    System.out.println(a.indexOf(new IssuerExportsWrapper(serachedWord)));
}

а как быть с поиском в двух других вложенных массивах объектов?
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472410
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_webdev_Blazkowiczпропущено...

Мне не нравится. Я подозреваю что там есть косяк с тем что одни и те же элементы будут разворачиваться.

Кста, не фильтрует, я так подозреваю, нужно стрим в массив переконвертировать который был на входе, а просто Collect.toList не сделать, так как не примитывный тип.. - можно .map для конвертации добавить, но в стриме же 3 разных типа объектов..
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472413
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_а как быть с поиском в двух других вложенных массивах объектов?Аналогично. Достаточно переопределить метод equals() в ContactExportsWrapper и ExportWrapper.
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472416
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_,

Я бы equals() не трогал.
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472419
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman_webdev_а как быть с поиском в двух других вложенных массивах объектов?Аналогично. Достаточно переопределить метод equals() в ContactExportsWrapper и ExportWrapper. - да, но это то же самое "решение в лоб"

Итерирование через все три массива. И проверки, какой объект к какому массиву принадлежит. Например начинаем итерировать в первом массиве не совпадение, в втором вложенном тоже, в третьем есть совпадение с fileName. Мне тогда нужно проверить, есть ли у меня уже объект из первого массива и второго...
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472424
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman_webdev_а как быть с поиском в двух других вложенных массивах объектов?Аналогично. Достаточно переопределить метод equals() в ContactExportsWrapper и ExportWrapper. - проитерировать и сравнить не проблема, но паковать обратно объекты в результат сделает код немного монструозным.. Чего я хочу избежать..
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472428
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_- проитерировать и сравнить не проблема, но паковать обратно объекты в результат сделает код немного монструозным.. Чего я хочу избежать..
Не очень понятно какой результат нужен.
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472437
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
public static final String serachedWord = "bu";

public static class IssuerExportsWrapper implements Comparable<String> {

    public String name;

    public IssuerExportsWrapper(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(String o) {
        return name.compareToIgnoreCase(o);
    }
}

public static void main(String[] args) throws Exception {
    List<IssuerExportsWrapper> a = new ArrayList<>();
    a.add(new IssuerExportsWrapper("au"));
    a.add(new IssuerExportsWrapper("bu"));
    a.add(new IssuerExportsWrapper("cu"));

    
    System.out.println(Collections.binarySearch(a, "bu"));
}
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472442
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz_webdev_- проитерировать и сравнить не проблема, но паковать обратно объекты в результат сделает код немного монструозным.. Чего я хочу избежать..
Не очень понятно какой результат нужен.

Еще не тестировал, но воот как-то так.. Результат нужен в таком же формате.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
List<IssuerExportsForAllContactsWrapper> tempReturn = new ArrayList<>();
String[] queryParts = filter.query.split(" ");

      for (int i = 0; i < exportsForAllContacts.size(); i++)
      {
         IssuerExportsForAllContactsWrapper issuerWrapper = exportsForAllContacts.get(i);
         if (issuerWrapper.issuerName.toLowerCase().contains(queryParts[0].toLowerCase())){
            tempReturn.add(issuerWrapper);
         }
         for (int j = 0; j < issuerWrapper.allExports.size(); j++)
         {
            ContactIssuerExportsWrapper contactWrapper = issuerWrapper.allExports.get(j);
            if (issuerWrapper.issuerName.toLowerCase().contains(queryParts[0].toLowerCase())){
               issuerWrapper = tempReturn.get(i);
               if (issuerWrapper==null){
                  tempReturn.add(issuerWrapper);
               }
               issuerWrapper.allExports.add(contactWrapper);
            }
            for (int k = 0; k <contactWrapper.allExportsForContact.size(); k++)
            {
               IssuerExportWrapper exportWrapper = contactWrapper.allExportsForContact.get(k);
               if (exportWrapper.filename.toLowerCase().contains(queryParts[0].toLowerCase())){
                  issuerWrapper = tempReturn.get(i);
                  if (issuerWrapper==null){
                     tempReturn.add(issuerWrapper);
                  }
                  contactWrapper = issuerWrapper.allExports.get(j);
                  if (contactWrapper==null){
                     tempReturn.get(i).allExports.add(contactWrapper);
                  }
                  tempReturn.get(i).allExports.get(j).allExportsForContact.add(exportWrapper);
               }
            }
         }
      }
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472453
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OMFG...
IssuerExportsWrapper
IssuerExportsForAllContactsWrapper
ExportWrapper
ContactExportsWrapper
ContactIssuerExportsWrapper

Мы готовим какой-то специальный ад для тех кто будет этот код поддерживать?
...
Рейтинг: 0 / 0
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
    #39472458
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczOMFG...
IssuerExportsWrapper
IssuerExportsForAllContactsWrapper
ExportWrapper
ContactExportsWrapper
ContactIssuerExportsWrapper

Мы готовим какой-то специальный ад для тех кто будет этот код поддерживать? - Батенька, я тоже не в восторге. Но это идет портирование одного продукта из ПХП. Врапперы для того, чтоб фронетнду легче было табличку строить. На самом деле объекта 3, просто я для примера имена укоротил, а в посл примере уже из кода скопировал.
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск строки в массивах которые вложены друг в друга - красивое решеение?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]