【问题标题】:get the key by comparing value in LinkedHashMap通过比较 LinkedHashMap 中的值获取密钥
【发布时间】:2018-05-07 11:18:28
【问题描述】:
  1. 我创建了一个名为 (ObjClass) 的自定义类。

  2. 我在 LinkedHashMap 中插入自定义类名称而不是值。像下面这样:

    LinkedHashMap 映射 = 新 LinkedHashMap;

  3. 我在 ObjClass 中有以下 getter 和 setter,名称有

    私有字符串名称;

    私有 int 级别;

    私有字符串父级;

现在的问题是,当我尝试通过比较特定字段(如未执行的名称)来获取密钥时。

我的代码如下:

        public class Practice {
     LinkedHashMap<Integer,ObjClass> map = new LinkedHashMap<>();
    public void addd(){
       int a = 10;
            int b = 20;
            int c = 30;
            ObjClass bb = new ObjClass();

bb.setName("COLOR");
       bb.setParent("ROOT");
       bb.setLevel(1);
       bb.getName();
       bb.getParent();
       bb.getLevel();
       map.put(a, bb);

bb.setName("RED");
bb.setParent("COLOR");
bb.setLevel(2);       
bb.getName();
bb.getParent();
bb.getLevel();
map.put(b, bb);

bb.setName("WHITE");
bb.setParent("COLOR");
bb.setLevel(2);        
bb.getName();
bb.getParent();
bb.getLevel();
map.put(c, bb); here



    // the problem is in the for loop i try to get the key of "red" which is 20 but my loop is not working..

    for (Map.Entry<Integer, ObjClass> entry : map.entrySet()) {
        if(entry.getValue().getName().equals("RED"))
        {
            System.out.println("yes"+ entry.getKey());

        }
    }
    System.out.println("    "+map.size());

    }
        public static void main(String[] args) {

               Practice pp = new Practice();
               pp.addd();

    }} 

【问题讨论】:

  • 我试图通过比较 entry.setValue.getName 来获得红色的键,但它没有工作,它应该返回 20 的键。
  • 如果你想通过名字访问你的地图值,为什么不把名字作为键呢?
  • @vanje 这很容易,但不幸的是我正在做一个项目,这就是为什么我想通过输入上面代码中提到的特定值(如“red”)来获取密钥的原因将返回“red”的键。
  • 你总是把同一个 bb 实例放到地图上。您需要创建一个新的 bb 实例。向集合中插入内容时,Java 不会创建副本。
  • 我是 java 新手,感谢@ZabojCampula。请看一下这个问题stackoverflow.com/questions/50238904/…

标签: java netbeans foreach linkedhashmap


【解决方案1】:

因为您只有一个 ObjClass 实例,它的名称被覆盖为 WHITE

【讨论】:

    【解决方案2】:

    您只为 LinkedHashMap 的所有输入提供单个实例。检查更新的代码。

    import java.util.LinkedHashMap;
    import java.util.Map;
    
    public class Main {
        Map<Integer, ObjClass> lMap  = new LinkedHashMap<>();
        public void addd(){
           int a = 10;
                int b = 20;
                int c = 30;
                ObjClass bb = new ObjClass();
    
    bb.setName("COLOR");
           bb.setParent("ROOT");
           bb.setLevel(1);
           bb.getName();
           bb.getParent();
           bb.getLevel();
           lMap.put(a, bb);
    
           bb = new ObjClass();       
    bb.setName("RED");
    bb.setParent("COLOR");
    bb.setLevel(2);       
    bb.getName();
    bb.getParent();
    bb.getLevel();
    lMap.put(b, bb);
    
    bb = new ObjClass();
    bb.setName("WHITE");
    bb.setParent("COLOR");
    bb.setLevel(2);        
    bb.getName();
    bb.getParent();
    bb.getLevel();
    lMap.put(c, bb);
    
    
        // the problem is in the for loop i try to get the key of "red" which is 20 but my loop is not working..
    
        for (Map.Entry<Integer, ObjClass> entry : lMap.entrySet()) {
            //System.out.println(entry.getKey() + "-" + entry.getValue().getName());
            if(entry.getValue().getName().equals("RED"))
            {
                System.out.println("yes"+ entry.getKey());
    
            }
        }
        System.out.println("    "+lMap.size());
    
        }
            public static void main(String[] args) {
    
                   Main pp = new Main();
                   pp.addd();
    
        }
    
    }
    

    你需要重新初始化它。

    bb = new ObjClass();
    

    【讨论】:

      【解决方案3】:

      在 Java 中,当所有对象变量都是引用时。结果,您的 bb 变量被最后一个值更改。修改后的代码如下:

      import java.util.LinkedHashMap;
      import java.util.Map;
      
      public class Practice {
          LinkedHashMap<Integer, ObjClass> map = new LinkedHashMap<>();
      
          public void addd() {
              int a = 10;
              int b = 20;
              int c = 30;
              ObjClass bb = new ObjClass();
      
              bb.setName("COLOR");
              bb.setParent("ROOT");
              bb.setLevel(1);
              bb.getName();
              bb.getParent();
              bb.getLevel();
              map.put(a, bb);
      
              bb = new ObjClass();
      
              bb.setName("RED");
              bb.setParent("COLOR");
              bb.setLevel(2);
              bb.getName();
              bb.getParent();
              bb.getLevel();
              map.put(b, bb);
      
              bb = new ObjClass();
              bb.setName("WHITE");
              bb.setParent("COLOR");
              bb.setLevel(2);
              bb.getName();
              bb.getParent();
              bb.getLevel();
              map.put(c, bb);
      
              // the problem is in the for loop i try to get the key of "red" which is
              // 20 but my loop is not working..
      
              for (Map.Entry<Integer, ObjClass> entry : map.entrySet()) {
                  if (entry.getValue().getName().equals("RED")) {
                      System.out.println("yes" + entry.getKey());
      
                  }
              }
              System.out.println("    " + map.size());
      
          }
      
          public static void main(String[] args) {
      
              Practice pp = new Practice();
              pp.addd();
      
          }
      }
      

      另见Is Java “pass-by-reference” or “pass-by-value”?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-25
        相关资源
        最近更新 更多