在Java中创建、搜索和修改(键、值1、值2)的最佳方法

在Java中创建、搜索和修改(键、值1、值2)的最佳方法,java,arrays,collections,set,storing-data,Java,Arrays,Collections,Set,Storing Data,我的程序正在搜索日志,并计算某些事件发生的次数(以及与每个事件相关的字节)。我想将我感兴趣的事件存储为(key,value1,value2),其中字符串是key,值是两个long。我需要能够搜索结构中是否存在键alrady,并且需要能够修改两个长值 我不打算使用数据库路径或将数据存储在另一个文本文件中 我没有成功地使用堆栈溢出搜索找到一些东西,Oracle教程和集合文档对我帮助甚微。我的选择(据我所知)是: 由(字符串、数组)组成的映射 2D数组(其中我将字符串移动到长字符串和背面) 元组对象

我的程序正在搜索日志,并计算某些事件发生的次数(以及与每个事件相关的字节)。我想将我感兴趣的事件存储为(key,value1,value2),其中字符串是key,值是两个long。我需要能够搜索结构中是否存在键alrady,并且需要能够修改两个长值

我不打算使用数据库路径或将数据存储在另一个文本文件中

我没有成功地使用堆栈溢出搜索找到一些东西,Oracle教程和集合文档对我帮助甚微。我的选择(据我所知)是:

  • 由(字符串、数组)组成的映射
  • 2D数组(其中我将字符串移动到长字符串和背面)
  • 元组对象
  • 我是否忽略了其他可能的优越解决方案?如果没有,你建议我用哪一种


    提前谢谢

    很难说你所说的“最好”是什么意思,但这就是我要做的。我有一个带有字符串键和一个简单元组对象的值的映射。您“可能”能够手动获得更好的性能,但使用地图的集合实现是最容易使用的,更重要的是,对于以后可能需要阅读/维护地图的其他人来说,也是最容易理解的。此外,还要注意过早优化。:-)

    很难说你所说的“最好”是什么意思,但这就是我要做的。我有一个带有字符串键和一个简单元组对象的值的映射。您“可能”能够手动获得更好的性能,但使用地图的集合实现是最容易使用的,更重要的是,对于以后可能需要阅读/维护地图的其他人来说,也是最容易理解的。此外,还要注意过早优化。:-)

    与#2类似的(如果同样令人反感的话)选项是使用128位
    BigInteger
    。一个更好的选择是使用A,这使得访问更高和更低的长值变得更容易,尽管仍然有点粗糙:

    // set
    map.put(key, new UUID(value1, value2);
    // get
    value1 = map.get(key).getMostSignificantBits();
    

    最“合适”的解决方案通常是创建一个自定义类来传递值所表示的内容以及它们之间的关系。如果它们没有关系,只是共享一个公共密钥,那么为每一组值保留一个单独的映射可能是值得的。

    类似的,如果同样令人反感的话,#2的选项是使用128位的
    BigInteger
    。一个更好的选择是使用A,这使得访问更高和更低的长值变得更容易,尽管仍然有点粗糙:

    // set
    map.put(key, new UUID(value1, value2);
    // get
    value1 = map.get(key).getMostSignificantBits();
    

    最“合适”的解决方案通常是创建一个自定义类来传递值所表示的内容以及它们之间的关系。如果它们没有关系,只是共享一个公共密钥,那么为每组值保留一个单独的映射可能是值得的。

    我不明白为什么散列映射不能简单地完成这项工作。似乎不是这样complicated@VicSeedoubleyeworacle文档声明“每个键最多可以映射到一个值”,我需要一个键来映射到两个值。看见我认为使用一个字符串键和一个元组的映射是可行的(Aaron Davis的回答)。是的,这就是我所说的简单hashmap。存储一个值的元组或存储一个值没有多大区别我不明白为什么散列映射不能简单地完成这项工作。似乎不是这样complicated@VicSeedoubleyeworacle文档声明“每个键最多可以映射到一个值”,我需要一个键来映射到两个值。看见我认为使用一个字符串键和一个元组的映射是可行的(Aaron Davis的回答)。是的,这就是我所说的简单hashmap。存储一个值元组或存储一个值并没有太大区别