【问题标题】:java arraylist add replace instead addjava arraylist 添加替换而不是添加
【发布时间】:2016-12-08 23:25:06
【问题描述】:

非常感谢。我很困惑开发一项学术工作,(n 个国际象棋皇后),所有递归线程都会生成正确的结果,但我正在尝试将解决方案(具有多行的列的整数数组)存储在 ArrayList 中,但我的问题是 arraylist 的方法 add() 替换了 arraylist 的内容而不是添加一个新的,我想这是一个与实例相关的问题,但我不知道如何解决它。当然是一个愚蠢的事实,因为我的 Java 水平很差。真的非常感谢您看一看!!。

package preda2.package_Preda_Reinas;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;

public class Vuelta_atras_reinas {

    ArrayList<Integer[]> vector_solucion = new ArrayList<>(); 

    public void reinas(Integer s[],Integer n,Integer k)  {                
        s[k] = 0;
        while (s[k]<= n-1) 
        {
            s[k]++;           
            if(computable(s,k))
            {              
                if(k==(n-1))
                {                    
                    vector_solucion.add(s);                    
                    System.out.println("solución encontrada: "+Arrays.toString(s));                    
                    for(int i=0;i<vector_solucion.size();i++)
                    {  
                        System.out.println("Size: "+vector_solucion.size()+" ["+i+"]"+Arrays.toString((Integer[]) vector_solucion.get(i)));
                    }                       
                }
                else reinas(s,n,k+1);
            }             
        }        
    }
    public boolean computable(Integer s[],Integer k)
      {        
          for(Integer i=0;i<=k-1;i++)
          {
            //  System.out.println("s[i] es "+s[i]+" s[k] es "+s[k]+" Math.abs(s[i]-s[k])es "+Math.abs(s[i]-s[k])+" Math.abs(i-k) es "+Math.abs(i-k));
              if(s[i] == s[k] || (Math.abs(s[i]-s[k])==Math.abs(i-k)))
                  return false;
          }
          return true;
      }    

}

我用句子从其他类的方法 main 调用函数 reinas:

Vuelta_atras_reinas Vuelta_atras_reinas_Bi = new Vuelta_atras_reinas();        
Integer s[]= new Integer[4];
Vuelta_atras_reinas_Bi.reinas(s,4,0);

结果是:

solución encontrada: [2, 4, 1, 3]
Size: 1 [0][2, 4, 1, 3]
solución encontrada: [3, 1, 4, 2]
Size: 2 [0][3, 1, 4, 2] <--- It must be [2,4,1,3]
Size: 2 [1][3, 1, 4, 2]

【问题讨论】:

    标签: java object arraylist


    【解决方案1】:

    您不断地向列表中添加相同的、唯一的数组。因此,您最终会在列表中对同一数组进行 N 次引用。

    如果您想记住所有中间值,则需要在将数组添加到列表之前制作一个副本。

    【讨论】:

    • 感谢您的快速响应,我之前尝试过这样做,但我做得很糟糕。我愿意:整数 s_local[] = new Integer[n]; s_local = s; vector_solucion.add(s_local);
    • 这会创建一个用 null 填充的新数组并将其分配给变量 s_local,然后通过将原始数组的引用分配给 s_local 来丢弃它。根本没有复制。谷歌“如何在 Java 中创建数组的副本”,点击第一个链接,然后阅读。
    猜你喜欢
    • 2021-08-23
    • 2015-02-05
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多