Замена значений для определенного ключа в древовидной карте изменяет значения для каждого ключа - PullRequest
0 голосов
/ 13 декабря 2018

По какой-то причине, когда я изменяю значение для определенного ключа в моей древовидной карте, каждое значение ключа по какой-то причине изменяется.Вот фрагмент кода,

ArrayList<Integer> bitor = new ArrayList<>();
TreeMap<Integer, ArrayList> a = new TreeMap<>();
for(int i=0; i<4; i++)
    bitor.add(0);
for(int i=0; i<n; i++)
{
    a.put(i, bitor);
}
System.out.println(a);
for(int i=0; i<n; i++)
{
    x = i;
    for(int j=0; j<n; j++)
    {
        if(x!=j)
        {
            y = j;
            for(int k=0; k<n; k++)
            {
                if(x!=k && y!=k)
                {
                    z = k;
                    System.out.println(a);
                    bitor = a.get(x);
                    if(bitor.get(0)==3)
                        break;
                    System.out.println(1+" "+x+" "+y+" "+z);
                    System.out.flush();
                    bitor.set(0, bitor.get(0)+1);
                    ans = sc.nextInt();
                    if(ans==-1)
                        System.exit(ans);
                    bitor.set(bitor.get(0), ans);
                    a.replace(x, bitor);
                }
                if(bitor.get(0)==3)
                    break;
            }
        }
    }
}

Выходное изображение

Предполагалось изменить только значение массива для ключа = 0, но изменилось каждое значение ключа.

Это немного странно, и я предполагаю, что совершаю глупую ошибку.

Ответы [ 2 ]

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

Вы должны создать новый ArrayList перед его добавлением, поскольку он не копируется, а добавляется в качестве ссылки в вашем дереве.

Самый простой способ решить эту проблему - простоизменить в начале:

TreeMap<Integer, ArrayList> a = new TreeMap<>();
for(int i=0; i<n; i++)
{
    ArrayList<Integer> bitor = new ArrayList<>();
    for(int j=0; j<4; j++)
        bitor.add(0);
    a.put(i, bitor);
}
0 голосов
/ 13 декабря 2018
for(int i=0; i<n; i++)
{
    a.put(i, bitor);
}

Это не то, что вы думаете.Каждый ключ указывает на одно и то же значение.Вы должны создать новый bitor явно для каждого i.

...