当我使用文本文件时,为什么我的代码打印空数组([])?

Joh*_*ana 5 java arrays bufferedreader

当我以这种方式定义我的数组字符串时:

String[] X = {"X","M","J","Y","A","U","Z"};
String[] Y = {"M","Z","J","A","W","X","U"};
Run Code Online (Sandbox Code Playgroud)

我的代码有效,它打印[M, J, A, U]出最长公共子序列XY但是当我为具有相同输入的字符串数组定义文本文件时,我的代码打印一个空数组[]。我该如何解决这个问题?

    public class LCS   {
    // Function to find LCS of String X[0..m-1] and Y[0..n-1]
    public static String A(String[] x, String[] y, int m, int n, int[][] T)
    {
        // return empty string if we have reached the end of
        // either sequence
        if (m == 0 || n == 0) {
            return new String();
        }
        // if last character of X and Y matches
        if (x[m - 1] == y[n - 1])
        {
            // append current character (X[m-1] or Y[n-1]) to LCS of
            // substring X[0..m-2] and Y[0..n-2]
            return A(x, y, m - 1, n - 1, T) + x[m - 1];
        }

        // else when the last character of X and Y are different

        // if top cell of current cell has more value than the left
        // cell, then drop current character of String X and find LCS
        // of substring X[0..m-2], Y[0..n-1]

        if (T[m - 1][n] > T[m][n - 1]) {
            return A(x, y, m - 1, n, T);
        }
        else {
            // if left cell of current cell has more value than the top
            // cell, then drop current character of String Y and find LCS
            // of substring X[0..m-1], Y[0..n-2]

            return A(x, y, m, n - 1, T);
        }
    }

    // Function to fill lookup table by finding the length of LCS
    // of substring X[0..m-1] and Y[0..n-1]
    public static void LCSLength(String[] x, String[] y, int m, int n, int[][] T)
    {
        // fill the lookup table in bottom-up manner
        for (int i = 1; i <= m; i++)
        {
            for (int j = 1; j <= n; j++)
            {

                // if current character of X and Y matches
                if (x[i - 1] == y[j - 1]) {
                    T[i][j] = T[i - 1][j - 1] + 1;
                }

                // else if current character of X and Y don't match
                else {
                    T[i][j] = Integer.max(T[i - 1][j], T[i][j - 1]);
                }
            }
        }
    }

    // main function
    public static void main(String[] args) throws IOException
    {
         String[] X =  read("C:\\Users\\fener\\Desktop\\producerconsumer\\Yeni Metin Belgesi.txt");
         String[] Y = read("C:\\Users\\fener\\Desktop\\producerconsumer\\Yeni Metin Belgesi (2).txt");

        //String[] X = {"X","M","J","Y","A","U","Z"}, Y = {"M","Z","J","A","W","X","U"};
        int m = X.length, n = Y.length;


        // T[i][j] stores the length of LCS of substring
        // X[0..i-1], Y[0..j-1]
        int[][] T = new int[m + 1][n + 1];

        // fill lookup table
        LCSLength(X, Y, m, n, T);

        String[] arr = A(X, Y, m, n, T).split("");
        // find longest common sequence
        System.out.print(Arrays.toString(arr));
        System.exit(0);
    }
    private static String[] read(String location) throws IOException {
        BufferedReader reader1 = new BufferedReader(new FileReader(location));
        String line;
        ArrayList<String> lines = new ArrayList<String>();
        while ((line = reader1.readLine()) != null) {
            lines.add(line);
        }
        reader1.close();
        String[] result = new String[lines.size()];
        for(int i=0; i<lines.size(); i++) {
            result[i] = lines.get(i);
        }
        return result;  
    }
    }
Run Code Online (Sandbox Code Playgroud)

rbe*_*nto 2

以下是一些提示:

""在 Java 中,使用构造函数和来实例化 String 是有区别的new String()

例如:

// Example 1
String a = "Y";
String b = "Y";
boolean result1 = a == b; // true

// Example 2
String c = new String("Y");
String d = new String("Y");
boolean result2 = c == d; // false
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为当您使用创建字符串时"Y",实际对象被分配在堆中称为字符串常量池的单独位置。任何后续分配都"Y"将返回对字符串常量池中同一对象的引用。

当您使用时,new String("Y")您是在说您想要在公共堆中分配一个全新的 String 对象实例。

==运算符比较 2 个对象以确定它们是否引用相同的对象实例,在这种情况下,该实例将有所不同,如示例 2 所示。

对于所提供的代码,必要的更改是:

在A方法中

// return empty string if we have reached the end of
// either sequence
if (m == 0 || n == 0) {
    return "";
}
...

// if last character of X and Y matches
if (Objects.equals(x[m - 1], y[n - 1])) {
...
Run Code Online (Sandbox Code Playgroud)

在LCSLength方法中

// if current character of X and Y matches
if (Objects.equals(x[i - 1], y[j - 1])) {
...
Run Code Online (Sandbox Code Playgroud)

这里java.util.Objects.equals==当时安全地进行比较equals()

通过应用这些更改,结果是:

[M, J, A, U]
Run Code Online (Sandbox Code Playgroud)

最后,该read方法不需要更改,但可以通过使用java.nioAPI 进行简化:

private static String[] read(String folder, String filename) throws IOException {
    Path path = Paths.get(folder, filename);
    List<String> lines = Files.readAllLines(path);
    return lines.toArray(new String[0]);
}
Run Code Online (Sandbox Code Playgroud)