【问题标题】:New Object in a loop is getting overwritten in Java循环中的新对象在 Java 中被覆盖
【发布时间】:2020-04-17 07:40:01
【问题描述】:

所以我正在尝试创建一个新对象以添加到列表中

public void findWord(char boggle[][], boolean visited[][], int i,
                          int j, String str)
{
    visited[i][j] = true;
    str = str + boggle[i][j];

    if (hasWord(str)) {
        for (char c : str.toCharArray()) {
            Position<Character> pos = new Position<>(c, i, j);
            list.add(pos);

        }
    }

    for (int row = i - 1; row <= i + 1 && row < 4; row++)
        for (int column = j - 1; column <= j + 1 && column < 4; column++)
            if (row >= 0 && column >= 0 && !visited[row][column])
                findWord(boggle, visited, row, column, str);

    visited[i][j] = false;
}

问题是基本上每个位置(行和列)都被覆盖到该对象的最后一个创建实例,但元素本身不是。

我的职位类别:

public class Position<T> {

private T element;
private int row;
private int column;

Position () {
    this(null,0,0);
}
Position (T element) {
    this.element = element;
}

Position (T element, int row, int column) {

    this.element = element;
    this.row = row;
    this.column = column;
}

public int getRow() {

    return row;
}

public int getColumn() {

    return column;
}

public T getElement() {

    return element;
}

public String toString() {

    return element + "(" + Integer.toString(row) + "," + column + ")";
}

也就是说,我打印后的 List 输出类似于:

a(2,2) a(2,2) r(2,2) o(2,2) n(2,2)

最后一个位置在元素和索引中都是正确的,但在矩阵索引中所有其他位置都失败了。应该是:

a(0,0) a(1,0) r(1,1) o(1,2) n(2,2)

孔类:

import java.io.*;

public class Boogle {

    LinkedList<Position<Character>> list = new LinkedList<>();

    static QuadHashTable<String> table = new QuadHashTable<>();

    String word;

    static char matrix [] [] = {

        {'a', '-', '-', '-'},
        {'a', 'r', 'o', '-'},
        {'-', '-', 'n', '-'},
        {'-', '-', '-', '-'}
    };

    public Boogle () {

        this(null);
    }

    public Boogle (char matrix [] []) {

        this.matrix = matrix;

    }

    public boolean hasWord (String s) {

        return s.equals(table.search(s));
    }

    public void findWordsUtil(char boggle[][], boolean visited[][], int i,
                              int j, String str)
    {

        visited[i][j] = true;
        str = str + boggle[i][j];

        if (hasWord(str))
            for (char c : str.toCharArray()) {
                Position<Character> pos = new Position<>(c, i, j);
                list.add(pos);
            }


        for (int row = i - 1; row <= i + 1 && row < 4; row++)
            for (int column = j - 1; column <= j + 1 && column < 4; column++)
                if (row >= 0 && col >= 0 && !visited[row][column])
                    findWordsUtil(boggle, visited, row, column, str);
        visited[i][j] = false;
    }

    public LinkedList<Position<Character>> solve () {

        String s = "";

        boolean visited[][] = new boolean[4][4];


        String str = "";


        for (int i = 0; i < 4; i++)
            for (int j = 0; j < 4; j++)
                findWordsUtil(matrix, visited, i, j, str);



        return list;
    }

    public static void main (String args []) throws IOException {

        BufferedReader br = new BufferedReader(new FileReader("/home/dsolipa/Desktop/allWords.txt"));

        String line;

        while((line = br.readLine()) != null) {

            table.insert(line);
        }

        Boogle boogle = new Boogle(matrix);

        System.out.println(boogle.solve());

        //System.out.println(boogle.hasWord("or"));

    }
}

【问题讨论】:

  • 在 for-each 循环之外定义 Position&lt;Character&gt; pos = new Position&lt;&gt;(c, i, j);
  • 我也遇到了同样的问题。不过谢谢!
  • 请发布所有代码
  • 缺少什么/不需要在那里?抱歉所有菜鸟问题-_-

标签: java loops object recursion


【解决方案1】:

似乎条件if (hasWord(str)) 仅在字符串为 aaron 时传递,并且您的 for 循环正在遍历字符串 str 并将所有字符添加到 n ie (2 ,2)。重新检查 QuadHashTable 类中的实现。

请进行以下更改:

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

public class Boogle {

    LinkedList<Position<Character>> list = new LinkedList<>();

    LinkedList<Position<Character>> table = new LinkedList<>();
    Map indexMap = new HashMap();
    static QuadHashTable<String> table = new QuadHashTable<>();

    String word;

    static char matrix [] [] = {

        {'a', '-', '-', '-'},
        {'a', 'r', 'o', '-'},
        {'-', '-', 'n', '-'},
        {'-', '-', '-', '-'}
    };

    public Boogle () {

        this(null);
    }

    public Boogle (char matrix [] []) {

        this.matrix = matrix;

    }

    public boolean hasWord(String s) {

        return s.equals(table.search(s));

    }

    public void findWordsUtil(char boggle[][], boolean visited[][], int i,
                              int j, String str)
    {

        visited[i][j] = true;
        str = str + boggle[i][j];


        if (hasWord(str))
        {
            for (char c : str.toCharArray())
            {            
                ArrayList coordinates = (ArrayList)indexMap.get(c);
                String xy = (String)coordinates.get(0);                

                if(coordinates.size() !=1) // or check with flag in visited matrix 
                {
                    coordinates.remove(xy);
                    indexMap.put(c,coordinates);                    
                }

                String [] rowCol = xy.split(":");
                int x = Integer.parseInt(rowCol[0]);
                int y = Integer.parseInt(rowCol[1]);                        

                Position<Character> pos = new Position<>(c, x, y);
                list.add(pos);
            }
            return;


        }


        for (int row = i - 1; row <= i + 1 && row < 4; row++)
            for (int column = j - 1; column <= j + 1 && column < 4; column++)
                if (row >= 0 && column >= 0 && !visited[row][column])
                    findWordsUtil(boggle, visited, row, column, str);
        visited[i][j] = false;
    }

    public LinkedList<Position<Character>> solve () {

        String s = "";

        boolean visited[][] = new boolean[4][4];


        String str = "";

        for (int i = 0; i < 4; i++)
            for (int j = 0; j < 4; j++)
            {
                if(indexMap.get(matrix[i][j])!=null)
                {
                    ArrayList list = (ArrayList) indexMap.get(matrix[i][j]);
                    list.add(i+":"+j);
                    indexMap.put(matrix[i][j],list);
                }else if(matrix[i][j]!='-')
                {
                    ArrayList list = new ArrayList();
                    list.add(i+":"+j);
                    indexMap.put(matrix[i][j],list);
                }

            }



        for (int i = 0; i < 4; i++)
            for (int j = 0; j < 4; j++)
                findWordsUtil(matrix, visited, i, j, str);



        return list;
    }

    public static void main (String args []) throws IOException {

        BufferedReader br = new BufferedReader(new FileReader("/home/dsolipa/Desktop/allWords.txt"));

        String line;

        while((line = br.readLine()) != null) {

            table.insert(line);
        }

        Boogle boogle = new Boogle(matrix);

        System.out.println(boogle.solve());

        //System.out.println(boogle.hasWord("or"));

    }
}

【讨论】:

  • 嘿,quadHastable 只是在表中搜索 str,因为 aaron 在那里,它基本上以 aaron 作为 str 进入 IF。也就是说,我的问题是 Position 类的行和列被覆盖。它应该在每次迭代时创建一个新位置,并且索引失败。奇怪的是元素不是...
  • 嗨,每次迭代都会创建一个新位置,其中元素正在更改,但 i 和 j 没有。因此,所有 Position 对象都具有相同的行和列 (a(2,2) a(2,2) r(2,2) o(2,2) n(2,2)) .您应该存储字符的索引并在创建实例时传递它们。 Position&lt;Character&gt; pos = new Position&lt;&gt;(c, i of c in matrix, j of c in matrix
  • @LockIt 我已经编辑了我的答案并将更改包含在 Boogle 类中以获得输出 a(0,0) a(1,0) r(1,1) o(1,2) n(2,2),让我知道它是否对你有用。
  • 它有效,但让我看看我是否得到它。因此,您基本上将每个位置都放在 HashMap 中,然后使用 ArrayList 获取它们,然后将它们传递给 LinkedList ?
  • 是的,我将字符的位置存储在以字符为键的 Hashmap 中。我使用 ArrayList 是因为一个字符可以有多个值(如 a(0,0) 和 a(1,0)),并且在创建 Position 对象时将使用存储的值。您可以根据自己的要求进一步改进代码。
猜你喜欢
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 2018-04-22
相关资源
最近更新 更多