Я перебираю хеш-карту, в которой объекты являются значениями, а строки - ключами.
ResultSet myresults = st.executeQuery("SELECT traces.* from traces");
while (myresults.next()) {
MethodTrace MethodTrace = new MethodTrace();
Method method= new Method();
Requirement requirement= new Requirement();
requirement=RequirementHashMap.get(myresults.getString("requirementid"));
method = MethodHashMap.get(myresults.getString("methodid"));
MethodTrace.setMethod(method);
MethodTrace.setRequirement(requirement);
//checking whether the method is present in the superclasses
MethodTrace.setGold(myresults.getString("goldfinal"));
String reqMethod=MethodTrace.Requirement.ID+"-"+MethodTrace.Method.ID;
String reqClass=MethodTrace.Requirement.ID+"-"+MethodTrace.Method.Owner.ID;
//THIS IS THE LINE RESPONSIBLE FOR THE BUG
MethodTrace.Method.Owner.DeveloperGold=classTraceHashMap.get(reqClass).DeveloperGold;
System.out.println(reqMethod+"-");
methodtraceHashMap.put(reqMethod, MethodTrace);
// System.out.println("WE ARE IN THE LOOP "+methodtraceHashMap.get("1-1"));
// System.out.println("WE ARE IN THE LOOP "+methodtraceHashMap.get("1-1"));
}
Вот упрощенная версия моего кода, в которой подчеркивается характер моей ошибки и ее точное местоположение:
for(MethodTrace MethodTrace: methodtraceHashMap2.values()) {
String reqClass=MethodTrace.Requirement.ID+"-"+MethodTrace.Method.Owner.ID;
String reqMethod=MethodTrace.Requirement.ID+"-"+MethodTrace.Method.ID;
//THIS IS THE LINE RESPONSIBLE FOR THE BUG MethodTrace.Method.Owner.DeveloperGold=classTraceHashMap.get(reqClass).DeveloperGold;
methodtraceHashMap2.put(reqMethod, MethodTrace);
System.out.println(methodtraceHashMap2.get("1-1").Method.Owner.getDeveloperGold());
}
Я устанавливаю значение каждого объекта в хэш-карте, извлекая его значение из другого хеш-карты, как показано в следующей строке
MethodTrace.Method.Owner.DeveloperGold=classTraceHashMap.get(reqClass).DeveloperGold;
Я устанавливаю значение methodtraceHashMap2.get("1-1").Method.Owner.getDeveloperGold()
на "T"
на первой итерации моего цикла, когда я перехожу на вторую итерацию моего цикла, мой цикл устанавливает значение для другого ключа (ключ "2-1"): от methodtraceHashMap2.get("2-1").Method.Owner.getDeveloperGold()
до "N"
, проблемаявляется то, что methodtraceHashMap2.get("1-1").Method.Owner.getDeveloperGold()
в конечном итоге будет установлен на "N"
также во второй итерации моего цикла, в то время как он должен быть "T"
, как это было установлено на "T"
в первой итерации.
Вотдругие мои классы
public final class MethodTrace {
public static boolean modified = false;
public Method Method= new Method();
public Requirement Requirement=new Requirement();
public String gold;
public String prediction;
public String goldfinal;
public String likelihood;
public String why;
boolean SubjectDeveloperEqualityFlag;
public Methods<String> SuperClassesListMethodTraces;
public Methods<String> InterfaceListMethodTraces;
public Methods<String> ChildrenListMethodTraces;
public Methods<String> ImplementationListMethodTraces;
public boolean TraceSet;
}
public class Method {
public String ID;
public String methodname;
public String fullmethodname;
public Clazz Owner= new Clazz();
public MethodList Callees= new MethodList();
public MethodList Callers= new MethodList();
public MethodList Interfaces= new MethodList();
public MethodList Implementations= new MethodList();
public MethodList Superclasses= new MethodList();
public MethodList Children= new MethodList();
}
public class Clazz {
public String ID;
public String classname;
public String DeveloperGold=new String();
public String SubjectGold;
public List<Clazz> Children= new ArrayList<Clazz>();
public List<Clazz> Parents= new ArrayList<Clazz>();
public List<Clazz> Interfaces= new ArrayList<Clazz>();
public List<Clazz> Implementations= new ArrayList<Clazz>();
public MethodList methods = new MethodList();
}
Вот объявление MethodTraceHashMap2:
static LinkedHashMap<String, MethodTrace> methodtraceHashMap = new LinkedHashMap<String, MethodTrace>();