HashMap Значение, которое является объектом, имеет атрибут, переопределенный с неправильным значением - PullRequest
0 голосов
/ 21 декабря 2018

Я перебираю хеш-карту, в которой объекты являются значениями, а строки - ключами.

 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>();

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Ваш цикл имеет следующую логику

  • Для каждого MethodTrace в значениях methodtraceHashMap2
    • Получите ключ из Requirement.ID и Owner.ID
    • Getзначение из classTraceHashMap, используя этот ключ, и замените поле DeveloperGold в MethodTrace значением
    • Получите еще один ключ из Requirement.ID и Method.ID
    • Поместите объект MethodTrace в карту methodtraceHashMap2 с помощьювторой ключ

Если вы пытаетесь найти значение DeveloperGold и поместить его в каждую методу MethodTrace, тогда вам не нужны последние 2 шага.то есть только следующее будет делать то, что вы хотите.

  • Для каждого MethodTrace в значениях methodtraceHashMap2
    • Извлечь ключ из Requirement.ID и Owner.ID
    • Получите значение из classTraceHashMap, используя этот ключ, и замените поле DeveloperGold в MethodTrace значением

Если, с другой стороны, вы меняете ключ для MethodTrace на карте,пока вы зацикливаетесь на значениях этой карты, это плохая идея.Вы должны сохранить их все на новой карте.

0 голосов
/ 21 декабря 2018

Из поведения, которое вы упомянули, кажется, что объект в hashmap одинаков для всех ключей, т.е.Вы должны были сделать

for(.......){
Object firstObject = new Object();
firstObject.setDevloperGold("value");
methodtraceHashMap2.put("key",firstObject);
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...