在java中为以下数据选择完美的数据结构
我必须根据我的需要选择一种数据结构,我在下面解释存在以下值的条件在java中为以下数据选择完美的数据结构,java,data-structures,Java,Data Structures,我必须根据我的需要选择一种数据结构,我在下面解释存在以下值的条件 abc,def,rty,ytr,dft which all are map to row R1B1 (actully key is combination of R1+B1) abEERc,dFFFef,rGGty which all are map to row R1B2 (actully key is combination of R1+B2) 现在,比如说,如果我得到ytr,那么我将能够检索R1B1 或者,假设我
abc,def,rty,ytr,dft which all are map to row R1B1 (actully key is combination of R1+B1)
abEERc,dFFFef,rGGty which all are map to row R1B2 (actully key is combination of R1+B2)
现在,比如说,如果我得到
ytr
,那么我将能够检索R1B1
或者,假设我得到值rGGty
,那么我就能够检索R1B2
现在的情况是,问题在于搜索、复杂性以及事情按顺序进行所需的时间
例如,它将首先选择要搜索的第一行ytr
,它将首先与不匹配的abc
匹配,然后必须与def
匹配,它将不再匹配,然后它将与不匹配的rty
匹配,然后它将最终与ytr
匹配,最后它将找到键R1B1
类似地,如果需要搜索第二个字符串,比如说rGGty
,那么它将扫描第一行,在其中它将找不到值,然后搜索将继续到第二行,并且在第三个元素的第二行,它将获得rGGty
作为元素,然后它将检索R1B2
作为值
比方说,如果把这个东西放在地图上,那么序列搜索将在键上进行,然后只有我们才能找到相应的值
各位朋友,请告诉我,哪种数据结构是我用java实现的最好的数据结构,在java中,我必须搜索键项以在非常快的时间内找到相应的值,这也不会影响性能
,这种数据结构的性能应该非常高
请告知大家可以使用
HashMap
在O(1)中访问键值对。但是,如果使用HashMap
,则更新该值将非常痛苦,因为字符串是不可变的。这意味着您必须检查所有条目集,如果值匹配,则更新它。因此,您可以为该值创建一个helper类,并让所有键指向该类的一个实例。这是一个包含最重要函数的存根,我想您可以自己添加其余的函数
public class MyDataStructure {
private Map<String, MyValue> key_value = new HashMap<String, MyValue>();
private Map<String, MyValue> value_MyValue = new HashMap<String, MyValue>();
public void set(String key, String value) {
MyValue v = value_MyValue.get(value);
if (v == null) { // should rarely happen, could check with containsKey
v = new MyValue(value);
value_MyValue.put(v);
}
key_value.put(key, v);
}
public String get(String key) {
return key_value.get(key).getValue(); // key might not exist
}
public String changeValue(String oldValue, String newValue) {
MyValue v = value_MyValue.remove(oldValue); // oldValue might not exist
v.setValue(newValue);
value_MyValue.put(newValue, v);
// will not work if newValue already exists... then you will have to merge
}
private class MyValue() {
private String value;
public MyValue(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
}
公共类MyDataStructure{
私有映射密钥_值=新HashMap();
私有映射值_MyValue=newhashmap();
公共无效集(字符串键、字符串值){
MyValue v=value\u MyValue.get(value);
如果(v==null){//应该很少发生,可以使用containsKey进行检查
v=新的MyValue(值);
价值(v);;
}
键_值put(键,v);
}
公共字符串获取(字符串键){
返回key_value.get(key).getValue();//键可能不存在
}
公共字符串changeValue(字符串oldValue、字符串newValue){
MyValue v=value\u MyValue.remove(oldValue);//oldValue可能不存在
v、 设置值(新值);
value_MyValue.put(newValue,v);
//如果newValue已经存在,则将不起作用…然后必须合并
}
私有类MyValue(){
私有字符串值;
公共MyValue(字符串值){
这个值=值;
}
公共字符串getValue(){
返回值;
}
公共void设置值(字符串值){
这个值=值;
}
}
}
我认为最好保持简单,直到性能不佳表明需要某种改进。即使许多映射值是相同的字符串,这也应该是可以的,因为Java在堆中只存储一个副本。如果映射到单个字符串的键集变得非常大,则可以通过执行两次查找来提高性能——第一次是确定集合成员身份,第二次是检索与集合关联的键的值。这很容易实现。目前,这里有一个直接的方法:
import java.util.*;
public class HashMapDemo {
static HashMap<String, String> map = new HashMap<String, String>();
public static void lookup(String key, String value) {
if (map.get(key) == value) {
System.out.println(key + " lookup ok");
} else {
System.out.println(key + " lookup produced" + map.get(key));
}
}
public static void main(String[] args) {
// requirements:
// abc,def,rty,ytr,dft ---> R1B1
// abEERc,dFFFef,rGGty ---> abEERc
Set<String> kset1 = new HashSet<String>(Arrays.asList("abc", "def",
"rty", "ytr", "dft"));
Set<String> kset2 = new HashSet<String>(Arrays.asList("abEERc",
"dFFFef", "rGGty"));
for (String s : kset1) {
map.put(s, "R1B1");
}
for (String s : kset2) {
map.put(s, "abEERc");
}
// testing value lookup with key
for (String s : kset1) {
lookup(s, "R1B1");
}
// prints:
// abc lookup ok
// dft lookup ok
// def lookup ok
// rty lookup ok
// ytr lookup ok
for (String s : kset2) {
lookup(s, "abEERc");
}
// prints:
// rGGty lookup ok
// abEERc lookup ok
// dFFFef lookup ok
// change key "R1B1" to "XYZ"
for (String s : kset1) {
map.put(s, "XYZ");
}
// test the change
for (String s : kset1) {
lookup(s, "XYZ");
}
// prints:
// abc lookup ok
// dft lookup ok
// def lookup ok
// rty lookup ok
// ytr lookup ok
}
}
import java.util.*;
公共类HashMapDemo{
静态HashMap map=newhashmap();
公共静态无效查找(字符串键、字符串值){
if(map.get(key)=值){
System.out.println(key+“lookup ok”);
}否则{
System.out.println(key+“lookup producted”+map.get(key));
}
}
公共静态void main(字符串[]args){
//要求:
//abc、def、rty、ytr、dft->R1B1
//abEERc,dFFFef,rGGty--->abEERc
Set kset1=newhashset(Arrays.asList(“abc”、“def”),
“rty”、“ytr”、“dft”);
Set kset2=newhashset(Arrays.asList(“abEERc”),
“dFFFef”、“rGGty”);
for(字符串s:kset1){
地图放置(s,“R1B1”);
}
for(字符串s:kset2){
图.put(s,“abEERc”);
}
//使用键进行测试值查找
for(字符串s:kset1){
查阅(s,“R1B1”);
}
//印刷品:
//abc查找ok
//dft查找正常
//def查找正常
//好的
//ytr查找正常
for(字符串s:kset2){
查找(s,“abEERc”);
}
//印刷品:
//rGGty查找正常
//abEERc查找正常
//dFFFef查找ok
//将键“R1B1”更改为“XYZ”
for(字符串s:kset1){
地图放置(s,“XYZ”);
}
//测试变化
for(字符串s:kset1){
查找(s,“XYZ”);
}
//印刷品:
//abc查找ok
//dft查找正常
//def查找正常
//好的
//ytr查找正常
}
}
为什么你不能有一个带有简单(一个单词)键的哈希表呢?@PM77-1仍然不能理解请详细解释存储以下几对:abc
-R1B1
,def
-R1B1
,等等。不要使用CSV格式存储。我会使用哈希图。如果使用它演示了性能问题,我会根据需要改进它。@ TrIS NefZGER非常感谢,你也可以展示你将如何存储这些元素并检索它们。
import java.util.*;
public class HashMapDemo {
static HashMap<String, String> map = new HashMap<String, String>();
public static void lookup(String key, String value) {
if (map.get(key) == value) {
System.out.println(key + " lookup ok");
} else {
System.out.println(key + " lookup produced" + map.get(key));
}
}
public static void main(String[] args) {
// requirements:
// abc,def,rty,ytr,dft ---> R1B1
// abEERc,dFFFef,rGGty ---> abEERc
Set<String> kset1 = new HashSet<String>(Arrays.asList("abc", "def",
"rty", "ytr", "dft"));
Set<String> kset2 = new HashSet<String>(Arrays.asList("abEERc",
"dFFFef", "rGGty"));
for (String s : kset1) {
map.put(s, "R1B1");
}
for (String s : kset2) {
map.put(s, "abEERc");
}
// testing value lookup with key
for (String s : kset1) {
lookup(s, "R1B1");
}
// prints:
// abc lookup ok
// dft lookup ok
// def lookup ok
// rty lookup ok
// ytr lookup ok
for (String s : kset2) {
lookup(s, "abEERc");
}
// prints:
// rGGty lookup ok
// abEERc lookup ok
// dFFFef lookup ok
// change key "R1B1" to "XYZ"
for (String s : kset1) {
map.put(s, "XYZ");
}
// test the change
for (String s : kset1) {
lookup(s, "XYZ");
}
// prints:
// abc lookup ok
// dft lookup ok
// def lookup ok
// rty lookup ok
// ytr lookup ok
}
}