Удаление повторяющихся строк в наборе результатов Java

Я новичок в Java, и у меня проблема с печатью повторяющихся строк. У меня есть такой код:

while (rs.next()) {

    String curr_crn = rs.getString(2);

    while(rs.next()) {
        if (curr_crn != rs.getString(2)) {
            String instructor = getInstructor(connection, 
                rs.getString(1),rs.getString(2));
            String student = getStudent(connection,rs.getString(2));

            detailLines.add(Library.rPad(rs.getString(1), COL1, ' ')
                + Library.rPad(rs.getString(2), COL2, ' ')
                + Library.rPad(rs.getString(3) + " " + rs.getString(4) + 
                    " " +rs.getString(5), COL3, ' ')
                + Library.rPad(instructor, COL4, ' ')
                + newline
                + Library.rPad(student, COL1 ,' '));
        }
    }
}

Как сравнить текущий crn с другим crn, чтобы не печатать дубликаты?

Благодарность!

Сделайте SELECT DISTINCT, чтобы избежать дублирования строк.

jarlh 16.10.2018 16:24

для этого назначения нам не разрешено изменять sql-запрос, поэтому мне нужно сделать в java-программе

user10513469 16.10.2018 16:27

Добавьте результаты в набор, например HashSet. Он не принимает дубликаты, поэтому добавленные дубликаты игнорируются.

Ole V.V. 16.10.2018 16:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
1 445
5

Ответы 5

Выберите Distinct, тогда вы не получите повторяющихся элементов.

для этого назначения нам не разрешено изменять sql-запрос, поэтому мне нужно сделать в java-программе

user10513469 16.10.2018 16:29

Вы используете какой-либо список для добавления данных, поэтому вместо использования списка используйте набор

GauravRai1512 16.10.2018 16:29

вы применили хэш-набор вместо списка?

GauravRai1512 16.10.2018 16:37

прежде чем собирать значения, в своем запросе вы можете использовать DISTINCT

SELECT DISTINCT column1, column2, ... FROM table_name;

SELECT DISTINCT возвращает только отдельные (разные) значения. SELECT DISTINCT удаляет повторяющиеся записи из результатов. DISTINCT можно использовать с агрегатами: COUNT, AVG, MAX и т. д.

Вы также можете попробовать хеш, вот так: Как HashSet не допускает дублирования?

Моя первая идея - просмотреть SQL-запрос и проанализировать, почему есть дубликаты. Поскольку вы говорите, что этот запрос для вас неприкасаем, мы предполагаем, что он просто возвращает то, что должен вернуть.

В этом случае я бы рекомендовал вам отделить доступ к данным от логики. Данные - это данные, и мы предполагаем, что они в порядке: просто верните их как список компонентов. Это наш уровень данных (некоторые называют его моделью).

Теперь наша цель - настоящее время данных без дубликатов. Другой класс, который составляет наш уровень представления (некоторые люди называют его представлением), может выполнять этот фильтр. Например, здесь у вас есть объяснение того, как фильтровать дубликаты в списке с потоками, добавленными в Java 8: https://www.baeldung.com/java-remove-duplicates-from-list

Я надеюсь, вы найдете это полезным.

Используйте HashSet для хранения уникальных crns и обработки строки только в том случае, если текущий crn не существует в HashSet

    Set<String> uniqueCrns = new HashSet<>();
    while (rs.next()) {

        String curr_crn = rs.getString(2);

        // check for duplicates
        if (uniqueCrns.contains(curr_crn)) {
            continue;
        }

        // the curr_crn is unique add it to the unique set and process it
        uniqueCrns.add(curr_crn);

        String instructor = getInstructor(connection,
                rs.getString(1),rs.getString(2));
        String student = getStudent(connection,rs.getString(2));

        detailLines.add(Library.rPad(rs.getString(1), COL1, ' ')
                + Library.rPad(rs.getString(2), COL2, ' ')
                + Library.rPad(rs.getString(3) + " " + rs.getString(4) +
                " " +rs.getString(5), COL3, ' ')
                + Library.rPad(instructor, COL4, ' ')
                + newline
                + Library.rPad(student, COL1 ,' '));

    }

Внутренний цикл while можно удалить, так как он усложняет код. Вы можете создать объект HashSet. Затем вы можете запустить цикл while и сохранить current_crn в наборе в последней строке на каждой итерации после вывода деталей. Код должен быть похож на следующий:

HashSet hs = new HashSet();
while (rs.next()) {
        String curr_crn = rs.getString(2);
            if ( ! hs.contains(curr_crn) ) {
                String instructor = getInstructor(connection, 
                                                rs.getString(1),rs.getString(2));
                String student = getStudent( connection, 
                                                  rs.getString(2));

                detailLines.add(Library.rPad(rs.getString(1), 
                                         COL1, ' ')
                     + Library.rPad(rs.getString(2), COL2, ' ')
                     + Library.rPad(rs.getString(3) + " " + 
                          rs.getString(4) + " " +
                          rs.getString(5), COL3, ' ')
                     + Library.rPad(instructor, COL4, ' ')
                       + newline
                        + Library.rPad(student, COL1 ,' '));
                   hs.add(curr_crn);
          }
       }

Другие вопросы по теме