Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Поиск строки в массивах которые вложены друг в друга - красивое решеение? / 25 сообщений из 36, страница 1 из 2
15.06.2017, 14:10
    #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
15.06.2017, 14:13
    #39472293
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
name к интерфейсу привести нельзя?
...
Рейтинг: 0 / 0
15.06.2017, 14:22
    #39472304
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
Blazkowiczname к интерфейсу привести нельзя? - Немного не понял Вас, названия полей менять не желательно, Обратно нужно отправлять такую же структуру.
...
Рейтинг: 0 / 0
15.06.2017, 14:25
    #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
15.06.2017, 14:29
    #39472313
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
BlazkowiczДа, что ж это такое, что уже и интерфейсы объяснять приходится... - Да нет, я просто не очень понял Вашего высказывания.
...
Рейтинг: 0 / 0
15.06.2017, 14:44
    #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
15.06.2017, 14:44
    #39472333
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
Да, но интерфейсы меня не освободят от итерирования через все три массива. И проверки, какой объект к какому массиву принадлежит. Например начинаем итерировать в первом массиве не совпадение, в втором вложенном тоже, в третьем есть совпадение с fileName. Мне тогда нужно проверить, есть ли у меня уже объект из первого массива и второго...
...
Рейтинг: 0 / 0
15.06.2017, 14:44
    #39472334
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
_webdev_Да нет, я просто не очень понял Вашего высказывания.
И поэтому решил проигнорировать вопрос полностью.
...
Рейтинг: 0 / 0
15.06.2017, 15:01
    #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
15.06.2017, 15:11
    #39472356
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
_webdev_Так вот нужно искать по name, contactName и filename
При этом паковать в результат только те объекты в которых
Код: java
1.
name.toLowerCase().equalsIgnoreCase(serachedWord) || contactName.toLowerCase().equalsIgnoreCase(serachedWord) || filename.toLowerCase().equalsIgnoreCase(serachedWord)



Поскольку у Вас три списка с поиском по совпадению в любом, т либо полное сканирование,
Либо заменяете свои списки на структуру, которая отчитывается тем или другим способом корню структуры о вхождении имени, а в нем уже делаете кеш на каком-нибудь дереве.
Замедляется вставка, но ускоряется поиск. :)
...
Рейтинг: 0 / 0
15.06.2017, 15:19
    #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
15.06.2017, 15:34
    #39472387
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
_webdev_- Почему, немного. Круто.
Мне очень нравится решение.

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

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

Кста, не фильтрует, я так подозреваю, нужно стрим в массив переконвертировать который был на входе, а просто Collect.toList не сделать, так как не примитывный тип..
...
Рейтинг: 0 / 0
15.06.2017, 15:45
    #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
15.06.2017, 15:48
    #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
15.06.2017, 15:49
    #39472410
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
_webdev_Blazkowiczпропущено...

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

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

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

Итерирование через все три массива. И проверки, какой объект к какому массиву принадлежит. Например начинаем итерировать в первом массиве не совпадение, в втором вложенном тоже, в третьем есть совпадение с fileName. Мне тогда нужно проверить, есть ли у меня уже объект из первого массива и второго...
...
Рейтинг: 0 / 0
15.06.2017, 15:59
    #39472424
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
Usman_webdev_а как быть с поиском в двух других вложенных массивах объектов?Аналогично. Достаточно переопределить метод equals() в ContactExportsWrapper и ExportWrapper. - проитерировать и сравнить не проблема, но паковать обратно объекты в результат сделает код немного монструозным.. Чего я хочу избежать..
...
Рейтинг: 0 / 0
15.06.2017, 16:02
    #39472428
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
_webdev_- проитерировать и сравнить не проблема, но паковать обратно объекты в результат сделает код немного монструозным.. Чего я хочу избежать..
Не очень понятно какой результат нужен.
...
Рейтинг: 0 / 0
15.06.2017, 16:08
    #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
15.06.2017, 16:10
    #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
15.06.2017, 16:22
    #39472453
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск строки в массивах которые вложены друг в друга - красивое решеение?
OMFG...
IssuerExportsWrapper
IssuerExportsForAllContactsWrapper
ExportWrapper
ContactExportsWrapper
ContactIssuerExportsWrapper

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

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


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