替换树图中特定键的值会更改每个键的值
Replacing values for a particular key in treemap changes values for every key
出于某种原因,当我更改树状图中特定键的值时,每个键值都会因某种原因发生变化。这是代码片段,
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;
}
}
}
}
Output image
只有 key=0 的数组列表值本应更改,但每个键值都已更改。
这有点奇怪,我想我犯了一个愚蠢的错误。
for(int i=0; i<n; i++)
{
a.put(i, bitor);
}
这与您认为的不同。每个键都指向相同的值。您必须明确地为每个i
.
创建一个新的bitor
您应该在添加之前创建一个新的 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);
}
出于某种原因,当我更改树状图中特定键的值时,每个键值都会因某种原因发生变化。这是代码片段,
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;
}
}
}
}
Output image
只有 key=0 的数组列表值本应更改,但每个键值都已更改。
这有点奇怪,我想我犯了一个愚蠢的错误。
for(int i=0; i<n; i++)
{
a.put(i, bitor);
}
这与您认为的不同。每个键都指向相同的值。您必须明确地为每个i
.
bitor
您应该在添加之前创建一个新的 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);
}