2015-12-13 92 views
-2

我在填充地图,每个条目都成为每个条目。我不知道这是怎么发生的。映射多个键,相同的值

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 = 00000000,$ RA = 00000000,$ RA = 00000000,$ RA = 00000000 ,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000,$ ra = 0x00000000 ,$ ra = 0x00000000,$ ra = 0x00000000}

关于这种情况的任何想法?如果我将打印语句移到更早的位置,它会打印正确的条目数量,但全部完全相同。

+1

寄存器的equals和hashcode方法是如何实现的? – dunni

+0

你可以在寄存器中分享equals()吗? – Jan

+3

你在哪里初始化变量?每个寄存器是否都用'new'初始化? 'regName'和其他没有被声明为'static'是吗? – Kayaman

回答

0

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

然而,一对夫妇关于你的问题的考虑:

  • It's清楚,在你的程序中的某个时刻,你让你添加到地图中的变量指向同一个对象。可能是你最后创建的那个。
  • 检查地图是否以您想要的方式工作。当然,使用String作为键和Register作为值更合理。
0

我想你已经注意到变量 - 那是我错过的一步。当我真的很重视时,我一直非常勤奋,错过了它。谢谢!!! 地图的目的是将这组寄存器与其他寄存器分开使用。这是一个模拟器,有几种类型的寄存器。该地图包括那些在registerfile中,我需要能够显示它们。他们与他们的地址映射。 我有3种类型的寄存器:AbstractRegister(对所有寄存器都是超级寄存器),Register(所有没有微码的寄存器)和RegisterSpecialty(在取/解/执行过程中调用它们时具有使能/禁止它们的信号的微码) )。我这样做是因为我注意到没有信号的寄存器被自动禁用。

公共类注册延伸AbstractRegister {

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

/** * * 构造注册 */ 公共寄存器(){ 寄存器名= getRegName(); word = getWord(); }

/** * * 构造 *注册 * @参数NUM */ 公共寄存器(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(); 
} 
}