Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 1
Регистрация: 05.11.2015
Сообщений: 5
1

Поиск и сравнение объектов LinkedList

27.06.2018, 15:02. Просмотров 1176. Ответов 5
Метки нет (Все метки)


Здравствуйте!
Подскажите пожалуйста как сделать.

есть класс Demand
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class Demand {
 
    int id; 
 
    private double timeArrival; 
 
    private double timeStartService; 
 
    private double timeLeave;
 
    private double timeService;
}
Так же есть класс
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ForkJoinQueue {
...
    private static LinkedList[] inQ; 
 
    private static LinkedList[] outQ;
...
    inQ = new LinkedList[K];
    outQ = new LinkedList[K];
 
    for (int i = 0; i < K; i++) { //К=3
            inQ[i] = new LinkedList<Demand>();
            outQ[i] = new LinkedList<Demand>();
        }
...
В классе ForkJoinQueue создается три очереди inQ[i]. Заполняются объектами Demand. После по определенным условиям перекладываются в outQ[i].
В конце мне нужно в трех очередях outQ[i] найти элементы с одинаковым id и сохранить только тот у которого timeService наибольший.
Подскажите пожалуйста как найти эти объекты.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2018, 15:02
Ответы с готовыми решениями:

LinkedList составленный из объектов класса, как обратиться к полям объектов
Не могу сообразить как обратиться к полям объектов, добавленных в LinkedList. Суть такая: есть...

Декартово дерево. Передача объектов в дерево. Сравнение объектов в дереве
Нашёл статью про декартово дерево на хабре на языке C# https://habrahabr.ru/post/101818/ Переписал...

Сравнение объектов
У меня возник вопрос существует ли в java возможность сравнения объектов одного типа и получение их...

Сравнение объектов типовых параметров
Как сравнить объекты типовых параметров? Например:class Test&lt;K&gt; { private K a, b; ...

5
19 / 19 / 1
Регистрация: 12.03.2018
Сообщений: 252
27.06.2018, 15:28 2
https://metanit.com/java/tutorial/5.6.php

Comparable и Comparator. Ты сможешь сравнивать два объекта, по определенным параметрам, например timeService.

Добавлено через 14 минут
А что бы найти объект с определенным id надо добавить get для поля id. И использовать где надо, эти строки
Java
1
2
3
if(Demand.getId()== 5) {
// Если id, у этого объекта равен пяти, то тогда зайдешь в условие.
}
P.S если надо, полное готовое решение, то напиши, я решу.
0
2881 / 2293 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
27.06.2018, 15:33 3
реши
0
0 / 0 / 1
Регистрация: 05.11.2015
Сообщений: 5
27.06.2018, 15:40  [ТС] 4
Artyr2, спасибо! Comparable и Comparator - так можно сравнить элементы из одного LinkedList, да?
не могу реализовать условие:
если во всех трех очередях outQ[i] есть объект с id=1, то выбрать тот у которого больше timeService.

P.S если надо, полное готовое решение, то напиши, я решу.
если можно напиши пожалуйста.
0
19 / 19 / 1
Регистрация: 12.03.2018
Сообщений: 252
27.06.2018, 18:07 5
Класс Demand
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
public class Demand implements Comparable<Demand>{
 
    private int id;
    private double timeArrival;
    private double timeStartService;
    private double timeLeave;
    
    
    public double getTimeService() {
        return timeService;
    }
 
    public void setTimeService(double timeService) {
        this.timeService = timeService;
    }
    
    public void setId(int id) {
        this.id = id;
    }
 
    private double timeService;
    public int getId() {
        return id;
    }
 
    @Override
    public int compareTo(Demand dem) {
 
        return (int)(this.timeService - dem.timeService);
    }
    @Override
    public String toString(){
        return ("id " + id + " timeSevice = " + timeService);
    }
}
Тестовый класс на котором я проверял работоспособность

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void main(String[] args) {
        ArrayList<Demand> listD = new ArrayList<>();
        Random random = new Random();
        for(int i = 0; i < 10; i++){
            double value = random.nextInt(10);
            Demand demand = new Demand();
            demand.setTimeService(value);
            demand.setId(i);
            listD.add(demand);
        }
 
        Collections.sort(listD);
        for(int i = 0; i < listD.size(); i++){
            //System.out.println(listD.get(i));
        }
        System.out.println(listD.get(listD.size()-1));
 
    }
Класс ForkJoinQueue

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
public class ForkJoinQueue {
 
    private static LinkedList[] inQ;
    private static LinkedList[] outQ;
    private final static int K = 3;
 
    public static void main(String[] args) {
        inQ = new LinkedList[K];
        outQ = new LinkedList[K];
 
        for(int i = 0;i<K;i++){ //К=3
            inQ[i] = new LinkedList<Demand>();
            outQ[i] = new LinkedList<Demand>();
        }
///////////////////////////Вот это я дописал//////////////////////////
        for(int i = 0; i < K; i++){
            ArrayList<Demand> listD = new ArrayList<>();
            for(int j = 0; j < outQ[i].size(); j++){
                Demand demand = (Demand) outQ[i].get(j);
                if(demand.getId() == i){
                    listD.add(demand);
                }
            }
            Collections.sort(listD);
            System.out.println(listD.get(listD.size()-1));// Выводим с максимальным значением timeService. Тут просто сделаешь что тебе надо, если return то делай return
 
        }
 
    }
 
}
Хм... Я надеюсь разберешься. Если есть вопросы по коду, задавай!

Одно но, класс ForkJoinQueue, я не тестировал, но дописал внутри цикл который делает то, что тебе надо, сам разберешься как он работает.

Добавлено через 16 минут
если конечно, он работает =)
1
Автоматизируй это!
Эксперт Python
4055 / 2763 / 829
Регистрация: 30.03.2015
Сообщений: 9,009
Записей в блоге: 14
27.06.2018, 19:14 6
asd278, не уверен что верно понял твою задачу, но шаблон рабочий, можно и переделать под тебя
класс Деманд почти не менял, добавил туСтринг для вывода, статик для генерации случайных объектов, он тебе не нужен, я для тестов делал
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
class Demand {
    public static Demand getRandomDemand() {
        Demand d = new Demand();
        d.id = new Random().nextInt(6)+1;
        d.timeService = new Random().nextInt(30)+11;
        return d;
    }
 
    int id;
 
    private double timeArrival;
 
    private double timeStartService;
 
    private double timeLeave;
 
    private double timeService;
 
    public int getId() {
        return id;
    }
 
    public double getTimeService() {
        return timeService;
    }
 
    public void setTimeService(double timeService) {
        this.timeService = timeService;
    }
 
    @Override
    public String toString() {
        return "Demand with id=" + id + " with time " + timeService;
    }
}
далее сам код, он отбрасывает все деманды, которые в 1 экземпляре. Но из тех, кто встречаются дважды и более, остается только тот, у кого больше таймСервис
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
public static void main(String[] args) {
        LinkedList<Demand> outQ1 = new LinkedList<>();
        LinkedList<Demand> outQ2 = new LinkedList<>();
        LinkedList<Demand> outQ3 = new LinkedList<>();
        outQ1.add(Demand.getRandomDemand());
        outQ1.add(Demand.getRandomDemand());
        outQ1.add(Demand.getRandomDemand());
        System.out.println("list1:");
        outQ1.forEach(System.out::println);
        outQ2.add(Demand.getRandomDemand());
        outQ2.add(Demand.getRandomDemand());
        outQ2.add(Demand.getRandomDemand());
        System.out.println("list2:");
        outQ2.forEach(System.out::println);
        outQ3.add(Demand.getRandomDemand());
        outQ3.add(Demand.getRandomDemand());
        outQ3.add(Demand.getRandomDemand());
        System.out.println("list3:");
        outQ3.forEach(System.out::println);
        System.out.println("After merging:");
        //Все, что выше -не важно, просто заполняем листы, так как у меня нет твоих данных
        outQ1.addAll(outQ2);
        outQ1.addAll(outQ3);
        Map<Integer, List<Demand>> mapa = outQ1.stream().collect(Collectors.groupingBy(Demand::getId));
        LinkedList<Demand> result = new LinkedList<>(); //лист в котором будут результаты
        for (Map.Entry<Integer, List<Demand>> pair : mapa.entrySet()) {
            //если тебе нужны все, а не только дублированные, то в блоке элс добавляй просто в лист pair.getValue()
            if (pair.getValue().size() > 1) {
                result.add(pair.getValue().stream().max(Comparator.comparing(Demand::getTimeService)).get());
            }
        }
        result.forEach(System.out::println);
    }
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2018, 19:14

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Сравнение двух объектов разного типа
Доброго времени суток. Хочу распарсить вот такой json-файл. Сам код для этого дела: import...

Сравнение объектов
Как проверить равенство всех полей экземпляров класса без кучи условий в if?

Сравнение объектов
if ((a/b) &gt; (f.a/f.b)) { cout &lt;&lt; &quot;1 &gt; 2&quot; &lt;&lt; endl; return *this; объекты класса a и b имеют...

Сравнение объектов?
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt;...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.