Я новичок в 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, чтобы не печатать дубликаты?
Благодарность!
для этого назначения нам не разрешено изменять sql-запрос, поэтому мне нужно сделать в java-программе
Добавьте результаты в набор, например HashSet. Он не принимает дубликаты, поэтому добавленные дубликаты игнорируются.




Выберите Distinct, тогда вы не получите повторяющихся элементов.
для этого назначения нам не разрешено изменять sql-запрос, поэтому мне нужно сделать в java-программе
Вы используете какой-либо список для добавления данных, поэтому вместо использования списка используйте набор
вы применили хэш-набор вместо списка?
прежде чем собирать значения, в своем запросе вы можете использовать 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);
}
}
Сделайте
SELECT DISTINCT, чтобы избежать дублирования строк.