【问题标题】:Removing duplicate rows in Java resultset删除 Java 结果集中的重复行
【发布时间】:2018-10-16 14:22:32
【问题描述】:

我是 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 以避免重复行。
  • 对于这个作业,我们不允许更改sql查询,所以我必须在java程序中做
  • 将结果添加到集合中,例如HashSet。它不接受重复项,因此添加到其中的重复项将被忽略。

标签: java sql


【解决方案1】:

可以删除内部 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);
          }
       }

【讨论】:

    【解决方案2】:

    选择 Distinct 则不会收到重复的元素

    【讨论】:

    • 对于这个作业,我们不允许更改sql查询,所以我必须在java程序中进行
    • 您是否使用任何列表来添加数据,所以不要使用列表使用集合
    • 您是否应用了哈希集而不是列表?
    【解决方案3】:

    我的第一个想法是查看 SQL 查询并分析为什么存在重复。既然您说查询对您来说是不可触及的,我们将假设它只返回它必须返回的内容。

    在这种情况下,我建议您将数据访问与逻辑分开。数据就是数据,我们假设它们没问题:只需将它们作为 bean 列表返回。这是我们的数据层(有些人称之为模型)。

    现在我们的目标是呈现没有重复的数据。构成我们表示层的另一个类(有些人称之为视图)可以执行此过滤器。例如,您可以在此处解释如何使用添加到 Java 8 的流来过滤列表中的重复项:https://www.baeldung.com/java-remove-duplicates-from-list

    我希望你觉得这很有用。

    【讨论】:

      【解决方案4】:

      在获取值之前,您可以在查询中使用 DISTINCT

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

      SELECT DISTINCT 只返回不同的(不同的)值。 SELECT DISTINCT 从结果中消除重复记录。 DISTINCT 可用于聚合:COUNT、AVG、MAX 等。

      你也可以试试 hash,像这样:How does HashSet not allow duplicates?

      【讨论】:

        【解决方案5】:

        使用 HashSet 存储唯一的 crn,仅当当前 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 ,' '));
        
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-19
          • 2017-04-25
          • 2021-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-06
          相关资源
          最近更新 更多