映射多个键,相同的值

时间:2015-12-13 20:50:58

标签: java dictionary

我正在填充地图,每个条目都成为每个条目。我不知道这是怎么发生的。

public Map<Register, String> regFileList = new HashMap<Register, String>();
    /** $zero always zero (by hardware) */
    public Register zero = new Register(0);

// ....加上声明的所有其他寄存器......

private void populateRegFileList(){     
        zero.setRegNumber(0);
        zero.setRegName("$zero");
        zero.setWord("0x00000000");
        regFileList.put(zero, zero.getWord());
        at.setRegNumber(1);
        at.setRegName("$at");
        at.setWord("0x00000000");
        regFileList.put(at, at.getWord());
        v0.setRegNumber(2);
        v0.setRegName("$v0");
        v0.setWord("0x00000000");
        regFileList.put(v0, v0.getWord());
        a0.setRegNumber(3);
        a0.setRegName("$a0");
        a0.setWord("0x00000000");
        regFileList.put(a0, a0.getWord());
        a1.setRegNumber(4);
        a1.setRegName("$a1");
        a1.setWord("0x00000000");
        regFileList.put(a1, a1.getWord());
        a2.setRegNumber(5);
        a2.setRegName("$a2");
        a2.setWord("0x00000000");
        regFileList.put(a2, a2.getWord());
        a3.setRegNumber(6);
        a3.setRegName("$a3");
        a3.setWord("0x00000000");
        regFileList.put(a3, a3.getWord());
        a4.setRegNumber(7);
        a4.setRegName("$a4");
        a4.setWord("0x00000000");
        regFileList.put(a4, a4.getWord());
        s0.setRegNumber(8);
        s0.setRegName("$s0");
        s0.setWord("0x00000000");
        regFileList.put(s0, s0.getWord());
        s1.setRegNumber(9);
        s1.setRegName("$s1");
        s1.setWord("0x00000000");
        regFileList.put(s1, s1.getWord());
        s2.setRegNumber(10);
        s2.setRegName("$s2");
        s2.setWord("0x00000000");
        regFileList.put(s2, s2.getWord());
        s3.setRegNumber(11);
        s3.setRegName("$s3");
        s3.setWord("0x00000000");
        regFileList.put(s3, s3.getWord());      
        k0.setRegNumber(12);
        k0.setRegName("$k0");
        k0.setWord("0x00000000");
        regFileList.put(k0, k0.getWord());
        sp.setRegNumber(13);
        sp.setRegName("$sp");
        sp.setWord("0x00000000");
        regFileList.put(sp, sp.getWord());
        fp.setRegNumber(14);
        fp.setRegName("$fp");
        fp.setWord("0x00000000");
        regFileList.put(fp, fp.getWord());
        ra.setRegNumber(15);
        ra.setRegName("$ra");
        ra.setWord("0x00000000");
        regFileList.put(ra, ra.getWord());
        System.out.println(regFileList);
    }

打印:{$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000 ,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000}

关于这是如何发生的任何想法?如果我将print语句移动到更早的点,它会输出正确数量的条目,但都是相同的。

2 个答案:

答案 0 :(得分:0)

您的代码不完整,因为您没有显示正在创建的实例的位置。

但是,有关您的问题的几点注意事项:

  • 很明显,在程序的某个时刻,您将添加到地图中的所有变量都指向同一个对象。可能是你最后创建的那个。
  • 检查地图是否按您想要的方式工作。最可靠的是,使用String作为键,将Register作为值。

答案 1 :(得分:0)

我认为你固定了变量 - 这是我错过的一步。我一直如此勤奋,当它真的很重要时就错过了它。谢谢!!! 地图的目的是将这组寄存器与其他寄存器分开使用。这是一个具有多种寄存器的模拟器。地图包括寄存器文件中的那些,我需要能够显示它们。它们与地址一起映射。 我有3种类型的寄存器:AbstractRegister(所有寄存器都是超级寄存器),寄存器(所有没有微码的寄存器)和RegisterSpecialty(在获取/解码/执行周期中调用它们时,具有启用/禁用它们的信号的微码) 。我这样做是因为我注意到没有信号的寄存器被自动禁用了。

public class Register扩展AbstractRegister {

/** register number */
private int regNum;
/** 32 bit32 address in hex format */
private String word;
/** name of register */
private static String regName;

/ **     *     *构造函数注册     * /     public Register(){     regName = getRegName();     word = getWord();     }

/ **     *     *构造函数     *注册     * @param num     * /      public Register(int num){     setRegNumber(NUM);     }

 /**
  * increment   
  * @param string 
  * @param more2
  * @return 
  */
   public String increment(String string) {
String s = string.trim();
s = string.replaceFirst("0x", "");
int src1 = Integer.parseInt(s);
Micro.DrALU.setFlag("1");
String s1 = "0x" + new ALU().input(src1, 1, 0b00);
return s1;
}


 /**
  * setRegNum
  * @param regSel the regSel to set
  */
  public void setRegNum(int regNum) {
this.regNum = regNum;
}

 /**
  * 
  * setRegName
  * 
  * @param name
   */
 public void setRegName(String name) {
regName = name;

}


 /**
  * @return the regName
  */
 @Override
  public String getRegName() {
return regName;
}


  /**
  * @return the word
   */
   @Override
   public String getWord() {
return word;
}

  /**
   * @param word
   *            the word to set
  */
  @Override
public void setWord(String word) {
if(word != null){
    this.word = word;
    }else{
    word = "0x00000000";
    }
}

 /**
  * 
  */
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append(getRegName());
sb.append(" ");
//      sb.append(getRegNum());
    //      sb.append(" ");
    //      sb.append(getWord());
    return sb.toString();

}

 /**
  * setRegNumber    
  * @param i
  * @return
  */
  public void setRegNumber(int i) {
    regNum = i;

}

 /**
  * getRegNum
  * @return the regNum
  */
  public int getRegNum() {
return regNum;
}


 /**
  * valueOfNumber   
  * @param reg   * @return
  */
  public int valueOfNumber(Register reg) {
return this.regNum;
}

 /**
  * valueOf 
  * @param trim
  * @return
  */
   public String valueOf(String name) {
setRegName(name);       
return name.toString();
}
}