无法解释的地图行为

时间:2011-12-01 06:24:01

标签: java

我正在尝试为学校作业构建一个程序,该程序在给定一组功能依赖性的情况下生成传递闭包。我正在使用JAVA。为了使它能够识别字符串子集,我必须构建一个名为Attribute的类,它由一个char和一个布尔字段组成(以帮助进一步识别包含字符序列的字符串

然后我有一个名为FunctionalDependency的类,它只有两个地图     <Integer, Attribute>。  第一个地图代表左手,第二个地图代表属性的右手。

最后,我执行实际计算的主程序有一个Integer,FunctionalDependency的映射,它表示用户想要输入的依赖关系集。我的问题位于方法insertFD()中,更具体地说,位于第一个for{}块中。虽然在for block中,地图似乎具有我想要的值,但在它之外(意味着在循环的最后一次调用之后)它会复制到地图的所有位置,输入的最后一个字符会破坏进一步的计算。

   /*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专家,但我在代码中看不到错误,如果你能帮助我,我会很高兴,提前谢谢。

3 个答案:

答案 0 :(得分:2)

您的问题是您在循环的每次传递中不断重复使用相同的tempAttrLeft和tempAttrRight。地图中的每个键都指向同一个对象!您需要在循环的每次传递中创建新的tempAttrLeft和tempAttrRight。地图保留对您放入其中的对象的引用,它不会“复制”它。因此,当您在循环的下一次传递中更改值时,该映射键将指向具有新值的相同映射键。

答案 1 :(得分:0)

我不确定预期和实际输出是多少。但是你可以尝试的东西很少:

  1. 您不会在tempString.toUpperCase();中获得大写字母这是因为String的不变性功能。而是:tempString = tempString.toUpperCase();
  2. 接受右手输入时重新初始化tempString

答案 2 :(得分:0)

for循环中,您使用的Attribute实例对于每个j都是相同,因此在循环之后,每个地图条目都包含相同的Attribute