Java从结果集中删除重复值

时间:2013-02-01 11:07:22

标签: java

我需要根据某些唯一标识符从结果集中删除重复值。

我需要从结果集中删除重复项。

  while(resultSet.next())
  {     
   int seqNo = resultSet.getInt("SEQUENCE_NO");

   String tableName = resultSet.getString("TABLE_NAME");

   String columnName = resultSet.getString("COLUMN_NAME");

  String filter = resultSet.getString("FILTER");

 }

从上面的迭代中,我从结果集中得到2行。有相同的seq no,相同的表名,不同的列名,相同的过滤器。

1 PRODUCTFEES CHARGETYPE PRODUCTID

1 PRODUCTFEES PRODUCTCODE PRODUCTID

我的要求是删除重复的表名,重复seq no,重复过滤器。

我希望得到以下输出,

1 PRODUCTFEES CHARGETYPE PRODUCTCODE PRODUCTID

2 个答案:

答案 0 :(得分:0)

根据您提供的示例,您似乎想要为每个列单独输出所有不同的值(表中有4列,但您输出5个值)。

作为标记为java的问题,您可以采用的方法是为每个列使用Set的实现,以便重复项无法通过。然后输出每个Set的所有元素。

LinkedHashSet[] sets = new LinkedHashSet[]{
    new LinkedHashSet(), 
    new LinkedHashSet(),
    new LinkedHashSet(),
    new LinkedHashSet() };

while(resultSet.next()) {     
    sets[0].add(resultSet.getInt("SEQUENCE_NO"));
    sets[1].add(resultSet.getString("TABLE_NAME")););
    sets[2].add(resultSet.getString("COLUMN_NAME"));
    sets[3].add(resultSet.getString("FILTER"));
}

StringBuilder buf = new StringBuilder();
for (LinkedHashSet set : sets) {
    // append to buf all elements of each set
}

但是从同一个SQL查询中解决这个问题可能更简单,只需为每个列创建SELECT DISTINCT columnX并输出结果而无需进一步操作。或者使用聚合函数来连接所有不同的值。实现将高度依赖于您正在使用的DBMS(对于MySQL GROUP_CONCAT,对于Oracle,LISTAGG,...)。对于Oracle来说,这也是一个类似的问题:How to use Oracle's LISTAGG function with a unique filter?

答案 1 :(得分:0)

根据我所说的不同输出,您不仅需要删除重复项,还需要重复排序重复数据。

在这种情况下,您需要在while(resultSet.next())中填充新的数据数组(或类似结构),然后在新循环的数据对象上循环并相应地输出。

在Meta-Lang中,这将如下:

while resultset.next()
    if newdata-array has unique key
        add column-name to found entry in newdata-array
    else
        create new entry in newdata-array with column-name

while newdata-array.next()
    output seq, table-name
    while entry.column-names.next()
        output column-name
    output product-id