当前位置: 首页 > 知识库问答 >
问题:

在java中为以下数据选择完美的数据结构

弓华茂
2023-03-14

我必须根据我的需要选择一种数据结构,我在下面解释以下值的条件

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)


  KEY                      VALUE
abc,def,rty,ytr,dft --->    R1B1
abEERc,dFFFef,rGGty --->    R1B2

现在,比如说,如果我得到ytr,那么我将能够检索R1B1,或者说,我得到rGGty的值,那么我将能够检索R1B2

现在的情况是,重要的是搜索、复杂性和事情按顺序进行所需的时间

例如,它将首先选择要搜索的第一行,它将首先与不匹配的abc匹配,然后必须与def匹配,然后再与不匹配的rty匹配,最后与ytr匹配,最后找到键R1B1

类似地,如果需要搜索第二个字符串,比如说rGGty,那么它将扫描第一行,在其中它将找不到值,然后搜索将继续到第二行,并且在第三个元素的第二行,它将获得rGGty作为元素,然后将R1B2作为值检索

比方说,如果把这个东西放在地图上,那么序列搜索将在键上进行,然后只有我们才能找到相应的值

各位朋友,请告诉我,哪种数据结构是我用java实现的最好的数据结构,我必须在非常快的时间内搜索关键字项以找到相应的值,这也不会影响性能,这种数据结构的性能应该非常高

请忠告乡亲们

共有2个答案

楮庆
2023-03-14

我认为最好保持简单,直到糟糕的性能表明需要某种改进。即使许多映射值是同一个字符串,这也应该可以,因为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

    }
}
管梓
2023-03-14

可以使用HashMap在O(1)中访问键值对。但是如果使用HashMap

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;
    }
  }
}

 类似资料:
  • 我有一张地图,如下图所示,其中有一个键,值的类型为: 我想在之前的地图上再添加一个地图,这样就有一个键,它的值就是上面的地图。这是正确的数据结构吗?我们如何实现它? 我想要像下面这样的东西 如上所示,仅向映射引入了一个新键,其值为上一个映射。 所以它就像一张

  • 问题内容: 我想在进行Web服务调用之前检查数据库中是否已记录的记录。 这是我想像的查询形式,我似乎无法弄清楚语法。 有没有办法做到这一点?这样的查询叫什么? 我想将ID的列表传递给mysql,并希望它吐出数据库中尚未存在的ID? 问题答案: 为了确认我已正确理解,您想传递一个数字列表,并查看现有表中 不 存在哪些数字?有效: 您似乎可以随时建立此查询,在这种情况下,可以通过将上面的代码更改为 尽

  • 选择以data-xxx开头的完整属性,就像这个例子:data-a=and data-b=and data-c=不像这个例子:class=and style=https://i.stack.imgur.com/TVtle.png

  • 问题内容: 我有以下数据: 如何在Postgres中编写SQL语句以选择此数据为多维数组,即: 我以前在Postgres中已经见过这种数组的用法,但是不知道如何从表中选择数据到这种数组格式。 假设这里所有列都是。 问题答案: 您不能用于生成多维数组,至少不能用于或更高版本。 (但是即将发布的Postgres 9.5附带了该罐的新变体!) 您从@Matt Ball的查询中得到的是一个记录数组()。

  • 问题内容: 我正在建立一个网站来学习编码,并且正在尝试建立一个工具,用户单击一个选择/下拉列表,其中包含从数据库 cat 提取的某些类别名称,然后另一个选择与从数据库 subcat 提取的子类别名称一起出现。这几乎与Yelp的(向下分类)完全一样,就像Yelp的(向下分类)一样。 我还做了一个图: 我已经有一个从 cat 数据库中提取的类别下拉列表: 我有一个从subcat数据库中提取的subca

  • 问题内容: 我有一张桌子,上面有我所有顾客购买的东西。我想选择上周(从周日开始的一周)中的所有条目。 我已经试过了: 但是我得到了上周的数据,包括本周的数据,我只想要上周的数据。 如何只获取上周的数据? 问题答案: 此条件将返回上周日至周六的记录: 有一个例子: 在对@ d456的回答中: 在间隔的两端不使用星期日的午夜吗? 没错,包括间隔两端的周日午夜。要在间隔结束时排除周日的午夜,必须使用运算