【问题标题】:JAVA - Storing result set in hash table by grouping data efficientlyJAVA - 通过有效地分组数据将结果集存储在哈希表中
【发布时间】:2017-02-22 08:27:57
【问题描述】:

我想在哈希表中存储来自查询执行的结果集。 哈希表是这样的

Map<List<String>,List<Object>>

在哪里

List<String>, the hash table key, is a subset of the extracted fields
Object is a Java object corresponding to a database tuple (all fields)

因此,首先,必须对数据进行分组,以便创建每个键并对共享该键的所有项目进行分组。

与我目前的做法相关的伪代码是:

while(iterate){
     while(rs.next){ 
          if(key is empty)
                // build REFERENCE KEY and delete rs entry
          else
                // build key for i-th rs entry and compare it with the REFERENCE key. 
                   Eventually, get data and delete rs entry
     }
     rs.beforeFirst()
}

换句话说,结果集被迭代多次,每次创建一个新的键,以便与它比较拉曼结果集条目。每次删除处理过的条目,退出外循环。

由于结果集非常大(以及每个 List(Object) ),性能很差(每个键的加载时间非常长)。 将 order by 子句附加到查询中(以便对数据进行初步分组)并不能缓解问题。

有没有更有效的方法?

谢谢大家。

编辑

Input ResultSet
 ---------------------------------------------------------------
| Field1 | Field2 | Field3 | Field4 | Field5 | Field6 | Field7 |
---------------------------------------------------------------
|    X   |    A   | val1_3 | val1_4 | val1_5 | val1_6 | val1_7 |
|    X   |    A   | val2_3 | val2_4 | val2_5 | val2_6 | val2_7 |
|    Y   |    B   | val3_3 | val3_4 | val3_5 | val3_6 | val3_7 |
|    Z   |    C   | val4_3 | val4_4 | val4_5 | val4_6 | val4_7 |
|    Y   |    D   | val5_3 | val5_4 | val5_5 | val5_6 | val5_7 |
----------------------------------------------------------------

Key_Fields : [Field1, Field2]

Output Map
----------------------------------- 
|   KEY  |     VALUE              |  
-----------------------------------
| [X,A]  |   [Object1, Object2]   |
| [Y,B]  |   [Object3]            |
| [Z,C]  |   [Object4]            |
| [Y,D]  |   [Object5]            |
-----------------------------------

我使用List&lt;String&gt; 作为密钥,因为另一个ResultSet 可以有不同长度的Key_Fields

这里是我当前耗时的 Java 代码

while(itera){

            key = new ArrayList<String>();
            values = new ArrayList<AbstractClass>();

            while(rs.next()){

                if(key.isEmpty()){
                     // build REFERENCE KEY
                     // add first OBJECT to List<AbstractClass>
                     // delete this data from ResultSet
                }
                else{
                    // Build KEY_TO_BE_COMPARED
                    List<String> row_to_be_compared = new ArrayList<String>();
                   // If this key equals to REFERENCE KEY       
                    if(row_to_be_compared.equals(key)){
                        AbstractClass value_object = new AbstractClass();
                        ...
                        rs.deleteRow();
                    }
                    // ORDERBY clause in query ensures that, if keys don't match, then all objects related to REFERENCE KEY have been collected
                    else{
                        break;
                    }
                }
            }

            rs.beforeFirst();

            map.put(key, values);

            if(!rs.next() || items_loaded==max_hash_size)
                itera = false;
            else
                rs.beforeFirst();
            }
        }

【问题讨论】:

  • 为什么使用列表作为键?检查这个stackoverflow.com/questions/35560067/…
  • @Ashutosh 你认为使用String 而不是List&lt;String&gt; 可以减少执行时间吗?
  • 问题是你不能使用 List 作为键,抛开执行时间。密钥必须是不可变的。
  • 好的。由于String 是不可变的,因此它是一种替代方案。谢谢你的小费。关于最初的问题,有什么想法吗?
  • 我不完全明白你的问题。如果您可以显示一些示例值和最终输出,那么我将能够回复。如果可能,粘贴您的确切工作代码。

标签: java mysql hashtable


【解决方案1】:

而不是使用 List 作为键。使用具有 List 作为其实例变量的类。非常小心地覆盖等于。

【讨论】:

    【解决方案2】:

    您为什么不简化您的密钥,使其成为一个字符串,其中包含由特殊字符连接的所有连接字段(例如.)?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      相关资源
      最近更新 更多