Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 二进制搜索帮助:将文件读入数组,查找特定行_Java_Arrays_Binary Search - Fatal编程技术网

Java 二进制搜索帮助:将文件读入数组,查找特定行

Java 二进制搜索帮助:将文件读入数组,查找特定行,java,arrays,binary-search,Java,Arrays,Binary Search,在文件中,每个条目将包含两行;第一行是数字,第二行是标题。文件中的条目将按数字升序排列 创建一个将文件读入数组的程序。然后,用户将根据号码请求标题。您的程序将执行二进制搜索以查找标题 目前,我将文件中的所有内容读取到arrayList中,并从那里将其转换为数组 我的第一个主要问题是,我的二进制搜索方法似乎不起作用;我试图搜索一个数字,它只返回false。其次,即使这样做成功,我也不确定如何记录在文本文件中找到结果的行。我认为这是必要的,因为我必须在之后输出该行。这是文本文件外观的一个示例 二,

在文件中,每个条目将包含两行;第一行是数字,第二行是标题。文件中的条目将按数字升序排列

创建一个将文件读入数组的程序。然后,用户将根据号码请求标题。您的程序将执行二进制搜索以查找标题

目前,我将文件中的所有内容读取到arrayList中,并从那里将其转换为数组

我的第一个主要问题是,我的二进制搜索方法似乎不起作用;我试图搜索一个数字,它只返回false。其次,即使这样做成功,我也不确定如何记录在文本文件中找到结果的行。我认为这是必要的,因为我必须在之后输出该行。这是文本文件外观的一个示例

二,

弥赛亚戏剧

四,

晚祷

七,

受迫害的贤者的祈祷

等等,这是我目前的代码

package Psalms;

import java.io.*;

import javax.swing.*;

import java.util.ArrayList;

import java.util.List;

public class Psalms {



public static void main(String[] args) throws IOException {
    // Creates array list. Reads lines into it
    List<String> psalms = new ArrayList<String>();
    BufferedReader readFile = new BufferedReader(new FileReader("Psalms.txt"));
    String line;
    while ((line = readFile.readLine()) != null) {
        psalms.add(line);
    }
   readFile.close();

    String[] psalmArray = new String[psalms.size()];
    psalmArray = psalms.toArray(psalmArray);

    //Asks user what to search for.
    String psalmSearch = (JOptionPane.showInputDialog("What number Psalm would you like to search for?"));
    System.out.println("Binary Search: " + psalmSearch + " " + binarySearch(
            psalmArray, 0, psalmArray.length - 1, psalmSearch));

}

public static boolean binarySearch(String myArray[], int left,
        int right, String searchForPsalm) {
    int middle;

    if (left > right) {
        return false;
    }
    middle = (left + right) / 2;
    if (myArray[middle].equals(searchForPsalm)) {
        return true;
    }
    if (searchForPsalm.compareTo(myArray[middle]) < 0) {
        return binarySearch(myArray, left, middle - 1,
                searchForPsalm);
    } else {
        return binarySearch(myArray, middle + 1, right,
                searchForPsalm);
    }
}

}

现在,您要做的是将文件中每行的一个字符串添加到列表中。因此,该列表如下所示:

<"2", "The messianic drama", "4", "Evening prayer", "7">
Title List = <"The messianic drama", "evening prayer", "Prayer of the virtuous under 
persecution">
Tile Number List: <2,4,7>
问题是,当您尝试对此执行二进制搜索时,您正在将一些字符串与标题进行比较,而将一些字符串与数字进行比较

以下是我推荐的方法,假设您得到的文件已经排序:

在读取文件的行时,交替将它们添加到两个不同的列表中,其中一个列表包含标题,另一个列表将数字作为整数。从文件中添加数字时,请确保使用integer.parseIntString将其转换为整数。我们的想法是创建如下两个列表:

<"2", "The messianic drama", "4", "Evening prayer", "7">
Title List = <"The messianic drama", "evening prayer", "Prayer of the virtuous under 
persecution">
Tile Number List: <2,4,7>
你看到《2》和《另一部》中的弥赛亚戏剧在同一个索引中的位置了吗

然后,在执行二进制搜索查找标题编号时,如果找到要查找的编号,则只需在标题列表中的相同位置返回字符串


如果您的标题在文件中没有按顺序编号,您可能需要考虑生成字符串和整数的元组。这有点复杂,因为您必须创建一个类并实现一个比较器,以便正确地对它们进行排序。

假设您的文件经过正确验证,即每个诗篇编号后面都有一个文本行,那么对于现有的binarySearch方法,需要进行两个更正:

    .
    .
    middle = (left + right) / 2;
    middle += middle & 1;  // to the nearest even number
    .
    .
    .
    } else {
        return binarySearch(myArray, middle + 2, right,
                searchForPsalm);
    }
}
1由于所有诗篇数字都位于偶数数组位置,因此需要确保中间的偏移量设置为最接近的偶数

2对于“右侧”分区,应通过将其设置为“中间+2”跳过文本行

这将确保你在比较诗篇中的数字

现在,您可以返回字符串以显示关联的文本,而不是返回布尔值,因此下面是修改后的方法:

public static String  binarySearch(String myArray[], int left,
        int right, String searchForPsalm) {
    int middle;

    if (left > right) {
        return "";
    }
    middle = (left + right) / 2;
    middle += middle & 1;
    if (myArray[middle].equals(searchForPsalm)) {
        return myArray[middle + 1];
    }
    if (searchForPsalm.compareTo(myArray[middle]) < 0) {
        return binarySearch(myArray, left, middle - 1,
                searchForPsalm);
    } else {
        return binarySearch(myArray, middle + 2, right,
                searchForPsalm);
    }
}
如果找不到条目,它将返回空字符串

此外,如果还需要返回“middle”值,可以修改它以返回一个对象,例如Result,该对象同时具有“middle”和字符串值-请参见此处的示例: