Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
55 / 18 / 19
Регистрация: 11.11.2014
Сообщений: 463

Сравнение элементов в коллекциях

02.04.2020, 16:52. Показов 5625. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Есть неограниченное кол-во коллекций с объектами.
Объект с полями:
Java
1
2
3
4
int id;
String name;
Date startDate;
Date endDate
Нужно сравнить все элементы коллекций друг с другом. Т.е берем первую коллекцию, первый объект в ней с именем 'Вася', надо найти Васю во всех других и если все гуд, то сранить даты. Т.е name, startDate, endDate равны, id неравен

Добавлено через 13 минут
Все эти коллекции являются элементами коллекции. Мб удастся через stream решить, но у меня не получилось
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.04.2020, 16:52
Ответы с готовыми решениями:

Методы в коллекциях
Создайте метод , меняющий в коллекции , хранящей объекты типа <Boolean>, значения элементов , порядковый номер которых кратен 3 , на...

ToArray в коллекциях
Добрый день. Допустим, мне нужно получить обычный массив целочисленных значений из коллекции Treeset<Integer>; Есть перегруженный...

Полиморфизм в коллекциях
Добрый вечер, ответьте мне пожалуйста на два вопроса. Первый вопрос: В принципе, как работает полиморфизм я уже разобрался, но допустим...

15
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
02.04.2020, 17:37
Ну допустим сравнил. А дальше что?
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
02.04.2020, 18:25
Александр321321, смотрите thenComparing
0
55 / 18 / 19
Регистрация: 11.11.2014
Сообщений: 463
02.04.2020, 19:40  [ТС]
если еть такие элементы вернуть true иначе false)
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
02.04.2020, 19:55
Какие - такие?
0
55 / 18 / 19
Регистрация: 11.11.2014
Сообщений: 463
02.04.2020, 20:27  [ТС]
Написано же. Что в каждой коллекции должны быть разные объекты, но с одинаковыми значениями(кроме id), если да тру, если нет не тру
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
02.04.2020, 20:32
Цитата Сообщение от Александр321321 Посмотреть сообщение
Написано же. Что в каждой коллекции должны быть разные объекты
Покажи, где это написано?
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
02.04.2020, 22:14
Цитата Сообщение от Александр321321 Посмотреть сообщение
если еть такие элементы
Все или хотя бы один? Если все то allMatch(Predicate<? super T> arg0) если хотя бы один то anyMatch(Predicate<? super T> arg0) если вам еще надо учитывать более сложное условие (учитывать id), делайте более сложный предикат и все.
0
55 / 18 / 19
Регистрация: 11.11.2014
Сообщений: 463
03.04.2020, 09:32  [ТС]
тут не в этом суть, а в том как это реализовать) У тебя есть коллекция, в ней несколько других коллекций
list1.stream().map(x -> x).flatmap(x -> x.stream()) // тут мы получили все наши коллекции, а как теперь в каждой из них, найти объект с одинаковым именем, потом проверить у них даты, и так все объекты сверить. Т.е по-хорошему в каждой коллекции по 4 объекта с именами(name1,name2,name3,name4, естественно вразнобой) в каждой коллекции надо найти name1 и сверить, чтобы даты везде(во всех коллекциях) одинаковые были, потом name2 и тд

Добавлено через 1 минуту
Ничего не мешает создать метод и рекурсивно вызывать его передавая объект и след.лист и там сверять, но выглядит это ужасно с большим кол-вом итераций. С учетом того что оригинальное задание в разы сложнее, это только одна из частей
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
03.04.2020, 09:50
Александр321321, как ты собираешься сравнивать разные объекты? Ну реализуй в своих классах какой-нибудь общий интерфейс. Comparable в конце-концов...
0
55 / 18 / 19
Регистрация: 11.11.2014
Сообщений: 463
03.04.2020, 11:56  [ТС]
Тут вопрос самой логики. Как мне из mainList перебрать всех Vasia. Tсли в каждом листе он есть, то проверить, чтобы даты были одинаковые. Потом так же с Petya. Как бы просто сверить имя и даты двух объектов непроблема, здесь вопрос, как перебрать все эти элементы, не забывая что кол-во листов/элементов может быть разное.
Как я сделал:
1) получаю первый лист и беру у него первый объект
2) получаю второй лист
3) передаю в метод свой объект и второй лист, если в методе во втором листе найден объект с таким же именем и даты равны, возвращаю true. Если нет, то false и заканчиваю проверку.
4) если true, то передаю в метод объект и третий лист и так пока не пройдусь по всем листам
Потом беру второй объект из первого листа и всё заново. Выглядит ужасно с большим кол-вом итераций. Вот и спрашиваю, может можно как-то более компактно сделать
https://www.cyberforum.ru/atta... 1585902958
Миниатюры
Сравнение элементов в коллекциях  
0
 Аватар для Aviz__
2739 / 2048 / 507
Регистрация: 17.02.2014
Сообщений: 9,467
03.04.2020, 12:56
Цитата Сообщение от Александр321321 Посмотреть сообщение
с большим кол-вом итераций
про бинарный поиск слышал? например, этим способом в массиве из миллиарда элементов, чтобы найти нужный требуется всего 32 шага, в худшем случае))
0
55 / 18 / 19
Регистрация: 11.11.2014
Сообщений: 463
03.04.2020, 13:06  [ТС]
ага, только для него сначала отсортировать нужно, что так же подразумевает O(n) для каждого из моих списков. Да и суть то не в том как найти элемент в списке, а как сравнить элементы в нескольких списках
0
528 / 263 / 70
Регистрация: 11.12.2016
Сообщений: 1,223
03.04.2020, 13:06
Лучший ответ Сообщение было отмечено Александр321321 как решение

Решение

Александр321321, можно попробовать что-то типа такого
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
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;
 
public class CollectionOfCollection{
 
    public static void main(String[] args){
        System.out.println(" norm : "+checkList(list1, list2, list3));
        System.out.println(" listBadId "+checkList(list1, list2, list3, listBadId));
        System.out.println(" listBadName1 "+checkList(list1, listBadName1, list3, list2));
        System.out.println(" dolzhno norn t.k. list1 i listBadId ne konfliktuyut \n"+
                checkList(list2, list3, listBadId));
    }
    public static List<MyObj> list1 = Arrays.asList(
        new MyObj(11,"name1","name2","name3","name4"),new MyObj(12,"name1","name2","name3","name4"),
        new MyObj(13,"name1","name2","name3","name4"),new MyObj(14,"name1","name2","name3","name4"));
    public static List<MyObj> list2 = Arrays.asList(
        new MyObj(21,"name1","name2","name3","name4"),new MyObj(22,"name1","name2","name3","name4"),
        new MyObj(23,"name1","name2","name3","name4"),new MyObj(24,"name1","name2","name3","name4"));
    public static List<MyObj> list3 = Arrays.asList(
        new MyObj(31,"name1","name2","name3","name4"),new MyObj(32,"name1","name2","name3","name4"),
        new MyObj(33,"name1","name2","name3","name4"),new MyObj(34,"name1","name2","name3","name4"));
    public static List<MyObj> listBadId = Arrays.asList(
        new MyObj(11,"name1","name2","name3","name4"),new MyObj(42,"name1","name2","name3","name4"),
        new MyObj(43,"name1","name2","name3","name4"),new MyObj(44,"name1","name2","name3","name4"));
    public static List<MyObj> listBadName1 = Arrays.asList(
        new MyObj(51,"nameBad","name2","name3","name4"),new MyObj(52,"name1","name2","name3","name4"),
        new MyObj(53,"name1","name2","name3","name4"),new MyObj(54,"name1","name2","name3","name4"));
    public static boolean checkList(List<MyObj> ... list) {
        boolean accept = true;
        for(int i=0; i<list.length; i++) {
            List<MyObj> startList = list[i];
            List<MyObj> nextList = list[i==(list.length-1)? 0: i+1];
            accept = accept && startList.containsAll(nextList) &&
                    Stream.concat(startList.stream(),nextList.stream())
                   .mapToInt(MyObj::getId).distinct().count() == startList.size() + nextList.size();
        }
        return accept;
    }
}
Кликните здесь для просмотра всего текста
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
class MyObj {
    Integer id;
    String name1;
    String name2;
    String name3;
    String name4;
 
    public Integer getId(){
        return id;
    }
 
    @Override
    public int hashCode(){
        int hash=3;
        hash=41*hash+Objects.hashCode(this.name1);
        hash=41*hash+Objects.hashCode(this.name2);
        hash=41*hash+Objects.hashCode(this.name3);
        hash=41*hash+Objects.hashCode(this.name4);
        return hash;
    }
 
    @Override
    public boolean equals(Object obj){
        if(this==obj){
            return true;
        }
        if(obj==null){
            return false;
        }
        if(getClass()!=obj.getClass()){
            return false;
        }
        final MyObj other=(MyObj)obj;
        if(!Objects.equals(this.name1,other.name1)){
            return false;
        }
        if(!Objects.equals(this.name2,other.name2)){
            return false;
        }
        if(!Objects.equals(this.name3,other.name3)){
            return false;
        }
        if(!Objects.equals(this.name4,other.name4)){
            return false;
        }
        return true;
    }
    
    public MyObj(int id,String name1,String name2,String name3,String name4){
        this.id=id; 
        this.name1=name1;
        this.name2=name2;
        this.name3=name3;
        this.name4=name4;
    }    
}
Выглядит эта перемешка стримов и цикла немного коряво но логика думаю понятна. Попробуйте протестировать а потом подправить.
Code
1
2
3
4
5
 norm : true
 listBadId false
 listBadName1 false
 dolzhno norn t.k. list1 i listBadId ne konfliktuyut 
true
1
 Аватар для Aviz__
2739 / 2048 / 507
Регистрация: 17.02.2014
Сообщений: 9,467
03.04.2020, 13:13
Цитата Сообщение от Александр321321 Посмотреть сообщение
только для него сначала отсортировать нужно,
один список)) из других ты в нем ищешь.
Цитата Сообщение от Александр321321 Посмотреть сообщение
а как сравнить элементы в нескольких списках
ты прикалываешься чтоль? поиск на чем основан?
0
55 / 18 / 19
Регистрация: 11.11.2014
Сообщений: 463
03.04.2020, 17:16  [ТС]
containsAll решает мою задачу, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.04.2020, 17:16
Помогаю со студенческими работами здесь

Нумераторы в коллекциях
Здравствуйте нашел в сети такой пример для обьяснения нумераторов в коллекциях. class Program { static void Main() ...

Метод iterator в коллекциях
Здравствуйте! Не судите строго т.к. всего месяц занимаюсь самообучением java. Встрял на коллекциях. Не могу понять взаимодействие и...

Обобщенные типы в обобщенных коллекциях
Делаю векторный редактор. Надо реализовать в нем панель свойств. Хочу сделать ее на основе редакторов типов, чтобы когда выделяется фигура,...

Поиск неравных по свойству в двух коллекциях
List&lt;RefPartRow&gt; wrongThickness = new List&lt;RefPartRow&gt;(); foreach (var currentPart in partsWithSameDesignations) { ...

Слить совпадающие элементы в разных коллекциях
public class SalesOrder { public string Name { get; set; } public double Price { get; set; } public int Quantity {...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru