2011-12-01 106 views
0

我正在嘗試構建一個學校作業的程序,該程序可生成傳遞閉包給定的一組函數依賴關係。我正在使用JAVA。爲了使它識別字符串子集,我必須構建一個名爲Attribute的類,由char和布爾字段組成(以幫助進一步識別包含字符序列的字符串令人費解的地圖行爲

然後,我有一個名爲FunctionalDependency的類,它只具有兩個映射 <Integer, Attribute>。 第一圖表示左手和屬性的第二右手。

最後我的主要程序,它實際calculationhas地圖的Integer,FunctionalDependency一個,這表示該用戶希望將依賴集輸入。我的問題位於方法insertFD(),更具體地說在第一個for{}塊。在for塊中,映射似乎具有我想要的值,在它之外(意思是在最後一次調用循環之後),它會複製到映射的最後一個字符的地圖的所有位置,從而破壞進一步的計算。

/*The method for inserting a new FD*/ 
    public void insertFD() throws IOException{ 
     Map<Integer, Attribute > tempMapLeft= new HashMap<Integer,Attribute>(); 
     Map<Integer, Attribute > tempMapRight= new HashMap<Integer,Attribute>(); 
     Attribute tempAttrLeft = new Attribute(); 
     Attribute tempAttrRight = new Attribute(); 
     FunctionalDependency tempDependency=new FunctionalDependency(); 


     String tempString; 
     BufferedReader stdin = new BufferedReader (new InputStreamReader(System.in)); 
     System.out.println("Please give the string for the left hand:"); 
     System.out.flush(); 
     tempString=stdin.readLine(); 
     tempString.toUpperCase(); 
     System.out.println("Your input is "+tempString); 


     for(int j=0;j<tempString.length();j++) 
     { 
      System.out.println("for j="+j+"letter is "+(tempString.toCharArray()[j])); 
      tempAttrLeft.setTheCharacter(tempString.toCharArray()[j]); 
      tempAttrLeft.setCheck(true); 
      tempMapLeft.put(j, tempAttrLeft); 
      System.out.println("I just inserted "+ tempAttrLeft.getTheCharacter()); 
      System.out.println("Here is the proof: "+tempMapLeft.get(j).getTheCharacter()); 
     } 
     System.out.println(tempMapLeft.get(0).getTheCharacter()); 
     System.out.println(tempMapLeft.get(1).getTheCharacter()); 
     tempDependency.setLeftHand(tempMapLeft); 
     //fSet.put(number, tempDependency); 
     //fSet.get(number).setLeftHand(tempMapLeft); 

     System.out.flush(); 
     System.out.println("Your left hand is at 0 "+ tempDependency.getLeftHand().get(0).getTheCharacter()); 
     System.out.println("Your left hand is at 1 "+ tempDependency.getLeftHand().get(1).getTheCharacter()); 

我沒有任何Java專家,但我看不到我的代碼錯誤,我會很高興,如果你能幫助我,在此先感謝。

+1

你會得到更有效的幫助,如果你不不要把你的全部代碼轉儲給我們,而是花點時間只提供**相關的**代碼。換句話說,仔細檢查你的代碼,並將其解釋爲展示問題的*最小*示例。請參閱http://sscce.org。 –

+0

一個無關的提示:你可以省略'System.out.flush()'調用; 'println'會自動刷新流,除非你不想讓它失敗。 –

+0

謝謝!現在編輯問題! – Damerian

回答

2

你的問題是,你不斷重複使用相同的tempAttrLeft和tempAttrRight在循環的每個過程中。地圖中的每個鍵都指向同一個對象!您需要在循環的每個過程中創建一個新的tempAttrLeft和tempAttrRight。該地圖保持對你放入它的對象的引用,它不會「複製」它。因此,當您更改循環的下一個循環中的值時,該映射關鍵字會與新值相同。

+0

謝謝!我在'for'循環中聲明瞭'tempAttribute',而不是在外面,問題就解決了!謝謝! – Damerian

0

我不確定什麼是預期的和實際的輸出。但是,一些事情可以嘗試:

  1. 你不會得到大寫的tempString.toUpperCase();這是因爲對String不可改變的特徵。相反:tempString = tempString.toUpperCase();
  2. 當接受右手輸入時重新初始化tempString
+0

感謝RC編輯我的文章:-)。下次我會照顧的。 – Gaurav

0

在你for循環,您使用的是Attribute實例,它是每一個j相同,所以在循環後,每個地圖項包含相同Attribute

+0

謝謝!這是確切的問題,現在是固定的! – Damerian