我正在尝试为学校作业构建一个程序,该程序在给定一组功能依赖性的情况下生成传递闭包。我正在使用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专家,但我在代码中看不到错误,如果你能帮助我,我会很高兴,提前谢谢。
答案 0 :(得分:2)
您的问题是您在循环的每次传递中不断重复使用相同的tempAttrLeft和tempAttrRight。地图中的每个键都指向同一个对象!您需要在循环的每次传递中创建新的tempAttrLeft和tempAttrRight。地图保留对您放入其中的对象的引用,它不会“复制”它。因此,当您在循环的下一次传递中更改值时,该映射键将指向具有新值的相同映射键。
答案 1 :(得分:0)
我不确定预期和实际输出是多少。但是你可以尝试的东西很少:
tempString.toUpperCase();
中获得大写字母这是因为String
的不变性功能。而是:tempString = tempString.toUpperCase();
tempString
。答案 2 :(得分:0)
在for
循环中,您使用的Attribute
实例对于每个j
都是相同,因此在循环之后,每个地图条目都包含相同的Attribute