Значение ключа в хэш-карте устанавливается на значение другого ключа - PullRequest
0 голосов
/ 08 ноября 2018

У меня проблемы со значениями разных ключей в хэш-карте, которую я создал. Почему-то значения перезаписываются самой последней добавленной стоимостью.

Например:

map.put("String1", "123")
map.put("String2", "456")
System.out.println(map.get("String1")); //would print 456

Моя хэш-карта:

Map<String, Testing> systems = new HashMap<>();

Тестирование:

class Testing {

    private double[] ap;
    private double[] dcg;
    private double[] ndcg;

    public Testing(double[] _ap, double[] _dcg, double[] _ndcg){

        ap = _ap;
        dcg = _dcg;
        ndcg = _ndcg;

    }

    public double[] getAp(){

        return ap;

    }

    public double[] getDcg(){

         return dcg;

    }

    public double[] getNdcg(){

        return ndcg;

    }

}

Вот проблема (это файл):

systems.put(f.getName(), new Testing(ap, dcg, ndcg));

if(f.getName().equals("input.Flab9atdnN.gz") || 
    f.getName().equals("input.apl9lt.gz")) {
        System.out.println(f.getName() + ": " + 
        systems.get(f.getName()).getAp()[5]);
}

if(f.getName().equals("input.Flab9atdnN.gz")) {
    System.out.println(f.getName().equals("input.Flab9atdnN.gz"));
    double temp = systems.get("input.apl9lt.gz").getAp()[5];
    double temp2 = systems.get("input.Flab9atdnN.gz").getAp()[5];
    System.out.println("input.Flab9atdnN.gz: " + temp2 + ". input.apl9lt.gz: 
    " + temp);
}

Первый вывод дает разные значения для ключа «input.Flab9atdnN.gz» и ключа «input.apl9lt.gz».

System.out.println(f.getName() + ": " + systems.get(f.getName()).getAp() 
[5]);

Последний оператор печати дает то же значение для ключа "input.Flab9atdnN.gz", но дает ключ "input.apl9lt.gz" key "input.Flab9atdnN.gz". Ключ «input.Flab9atdnN.gz» добавляется в хэш-карту после ключа «input.apl9lt.gz», таким образом, все, что добавляется после ключа «input.Flab9atdnN.gz», будет также давать значение этого нового ключа для «input.Flab9atdnN.gz» .

double temp = systems.get("input.apl9lt.gz").getAp()[5];
double temp2 = systems.get("input.Flab9atdnN.gz").getAp()[5];
System.out.println("input.Flab9atdnN.gz: " + temp2 + ". input.apl9lt.gz: " + 
temp);

Есть какая-нибудь подсказка, почему это так и возможный обходной путь? Я пытался сделать что-то подобное со списками, и у меня возникла та же проблема. Я также пытался не использовать Тестирование.

Спасибо.

Редактировать (для входов):

input.apl9lt.gz

+0,160837098024862 +0,03075251487336594 +0,22437008086531643 0,1971910732696186 +0,26775040012743095 9.256258391747239E-4 0,1348288884102969 +0,04098977989693765 +0,22076261792825694 +0,14351330413359978 0,4326923076923077 +0,07127127472804279 4.552325182365065E-5 +0,010058991520632703 +0,013241228159087674 +0,010137295467368818 +0,16308220490382738 +0,013974532767649097 0,1591821903406855 +0,03546054590978735 +0,017811035142771457 +0,09931683119953653 +0,0012300123001230013 3.2100667693888034E-5 +0,13463869607114665 +0,056660951442691745 +0,009024064171122994 +0,00111158621285874 +0,19147531389263409 6.058415656054187E-4 +0,15122464967762936 +0,017945455244915694 +0,24100308685261787 6.295914132164171E-4 +0,41666666666666663 +0,16054778554778554 +0,12606805722666745 +0,03122700118062138 +0,05840908368719257 +0,06151876506910154 8.167932696234583E-5 +0,48663786619303134 +0,0017420658249683476 +0,20520161886380303 7.111269849728675E-5 0,1157176972265951 +0,28587824256374156 +0,032836748137528377 +0,04182754182754183 +0,02944176265259386

input.Flab9atdnN.gz

+0,4550531747779656 +0,11354712610736152 0,4465970245283123 +0,39990864084973815 +0,23410193071725469 8.08015513897867E-5 +0,11287817139653589 +0,02255268670973833 +0,30038335608865446 +0,21267974099603318 0,6041666666666666 +0,15726821262566176 +0,15690222729126874 1.5053439710973956E-4 0,0843584401155248 0,5027027027027027 0,1873237718924946 +0,005660813678763912 +0,012321170992537366 0,0529994153272247 +0,04489848129896188 +0,016508461433080466 0.0 1.0736065674698053E-4 +0,07164253590778259 +0,14083889573189318 +0,024676040805073064 +0,16099898114516484 +0,16509562037628656 +0,06488409960391041 +0,22263263699157246 0,0568843663526689 0,4175364417422477 0,1106842493991619 +0,15555555555555556 0,5416666666666666 0,4654817731306396 0,0930344930767678 +0,344114561968089 0,1882981402539536 +0,11698973634619976 0,4533746137676584 0,3389765988389732 +0,475199277730597 +0,08708693608991427 +0,34790332410690694 +0,035929746042875826 +0,08056424630498706 +0,20352743561030237 +0,12758565977230674

Прочитайте их в двойной массив (размер 50). Чтобы использовать класс Testing, просто удалите dcg и ndcg.

1 Ответ

0 голосов
/ 08 ноября 2018

Прежде всего:

import java.util.HashMap;

public class MapPutExample {

    public final static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("String1", "123");
        map.put("String2", "456");
        System.out.println(map.get("String1")); //would print 456
    }
}

отпечатки

123

Итак: Нет, это не так.

Вы получилиНе предоставлен фактический код, где мы можем видеть, как вы добавляете элементы на карту, но учитывая тот факт, что Testing содержит массивы, я предполагаю, что вы не инициализируете новые массивы при установке его значений из файла.Таким образом, вы делаете что-то вроде этого:

import java.util.HashMap;

public class MapPutExample {

    public final static void main(String[] args) throws Exception {
        HashMap<String, char[]> map = new HashMap<>();

        char[] buffer = new char[10];
        for (int i = 0; i < buffer.length; i++) {
            buffer[i] = (char) ('a' + i);
        }
        map.put("String1", buffer);
        for (int i = 0; i < buffer.length; i++) {
            buffer[i] = (char) ('k' + i);
        }
        map.put("String2", buffer);
        System.out.println(map.get("String1")); //would print klmnopqrst
    }
}

Это на самом деле печатает

klmnopqrst

Вам нужно создать новые массивы и установить их для Testing экземпляров, которые вы добавляете на карту:

import java.util.HashMap;

public class MapPutExample {

    public final static void main(String[] args) throws Exception {
        HashMap<String, char[]> map = new HashMap<>();

        char[] buffer = new char[10];
        for (int i = 0; i < buffer.length; i++) {
            buffer[i] = (char) ('a' + i);
        }
        map.put("String1", buffer);
        buffer = new char[10];
        for (int i = 0; i < buffer.length; i++) {
            buffer[i] = (char) ('k' + i);
        }
        map.put("String2", buffer);
        System.out.println(map.get("String1")); //would print klmnopqrst
    }
}

Это печать

abcdefghij

...