Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вывод объектов с уникальным полем / 9 сообщений из 9, страница 1 из 1
14.02.2014, 22:07
    #38561573
Leyla89
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод объектов с уникальным полем
Есть класс Студент и отсортированный список с 10 объектами (поля вводятся с консоли в формате id-оценка). Если есть несколько записей с одинаковыми id, то программа должна выбрать только одну запись с максимальной оценкой и вывести список объектов. Подскажите, пожалуйста, с помощью чего это сделать.
Код: 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.
public class Student implements Comparable {

private int idSt;
private int score;

public Student(int id, int sc) {
    idSt = id;
    score = sc;
}

public int getScore() {
    return score;
}

public int getIdStudent() {
    return idSt;
}

public String toString() {
    return idSt + "-" + score;
}

@Override
public int compareTo(Object obj) {
    Student tmp = (Student) obj;
    if (this.score > tmp.score) {
        return -1;
    } else if (this.score < tmp.score) {
        return 1;
    }
    return 0;
}
}

public class SortScore {

public static void main(String[] args) {
    List<Student> st = new ArrayList<Student>();

    Scanner sc = new Scanner(System.in);
    sc.useDelimiter("[-\\n]");
    for(int i = 0; i < 10; i++){    
        int a = sc.nextInt();
        int b = sc.nextInt();
        st.add(new Student(a, b));
    }

    Collections.sort(st);            
    System.out.println(st);     
}
}
...
Рейтинг: 0 / 0
15.02.2014, 00:42
    #38561648
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод объектов с уникальным полем
Данная задача эффективно решается на SQL. На Java она решается неэффективно.
...
Рейтинг: 0 / 0
15.02.2014, 10:40
    #38561743
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод объектов с уникальным полем
Leyla89, по-быстрому можно список в Set добавить.
Код: 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.
package student;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.HashSet;
import java.util.Scanner;

import static java.lang.System.out;

public class Student implements Comparable<Student> {

    public final int id, score;

    public Student(int id, int score) {
        this.id = id;
        this.score = score;
    }

    @Override public String toString() {
        return id + "-" + score;
    }

    @Override public int compareTo(Student anotherStudent) {
        if (id != anotherStudent.id) {
            return compareAsc(id, anotherStudent.id);
        }
        if (score != anotherStudent.score) {
            return compareDsc(score, anotherStudent.score);
        }
        return 0;
    }

    private static int compareAsc(int a, int b) { return a < b ? -1 :  1; }
    private static int compareDsc(int a, int b) { return a < b ?  1 : -1; }

    @Override public int hashCode() {
        return id;
    }

    @Override public boolean equals(Object another) {
        return another instanceof Student && id == ((Student) another).id;
    }

    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);
        scanner.useDelimiter("[-\\n]");
        while (scanner.hasNextInt()) {
            int id = scanner.nextInt();
            if (scanner.hasNextInt()) {
                int score = scanner.nextInt();
                students.add(new Student(id, score));
            }
        }

        Collections.sort(students);
        out.println(new HashSet(students));
    }
}
...
Рейтинг: 0 / 0
15.02.2014, 17:43
    #38561904
Alex Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод объектов с уникальным полем
Leyla89,

Сортировку сделать следующим образом: id по возрастанию, score по убыванию.
Затем за один проход в цикле просто вывести "первые" записи для каждого из id.
...
Рейтинг: 0 / 0
15.02.2014, 21:58
    #38561970
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод объектов с уникальным полем
Alex KuznetsovЗатем за один проход в цикле просто вывести "первые" записи для каждого из id.
Да, так лучше. Меньше магии, нагляднее, не создаём лишнюю коллекцию (HashSet) -> быстрее получаем результат, equals и hashCode можно удалить.
Ещё лучше не хранить не нужные score.
...
Рейтинг: 0 / 0
16.02.2014, 09:01
    #38562137
Alex Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод объектов с уникальным полем
avp.mk...
Ещё лучше не хранить не нужные score.Это невозможно по условию задачи...
...
Рейтинг: 0 / 0
16.02.2014, 09:02
    #38562138
Alex Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод объектов с уникальным полем
maytonДанная задача эффективно решается на SQL. На Java она решается неэффективно.Вопроса про эфективность и использования технологий отличных от Java не было.
...
Рейтинг: 0 / 0
16.02.2014, 09:42
    #38562142
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод объектов с уникальным полем
Leyla89,

Другой подход к решению задачи:
Код: 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.
class Students extends java.util.TreeMap<Integer, Integer> {

    private static final long serialVersionUID = 1L;
    
    @Override
    public Integer put(Integer id, Integer score) {
        if (containsKey(id)) {
            if (get(id) > score) {
                return null;
            }
        }
        return super.put(id, score);
    }
}

...

Students students = new Students();
students.put(20, 26);
students.put(20, 57);
students.put(48, 20);
students.put(9, 77);
students.put(67, 84);
students.put(95, 62);
students.put(75, 52);
students.put(54, 3);
students.put(62, 26);
students.put(26, 38);		
students.put(0, 5);
students.put(0, 4);
students.put(0, 3);
System.out.println(students); // {0=5, 9=77, 20=57, 26=38, 48=20, 54=3, 62=26, 67=84, 75=52, 95=62}
...
Рейтинг: 0 / 0
16.02.2014, 19:31
    #38562417
Alex Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод объектов с уникальным полем
Usman,

Решение не согласуется с условием задачи, т.к. в дерево попадают только объекты с максимальным значением score, а должны попадать все объекты...
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вывод объектов с уникальным полем / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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