使用Java </integer>放入Array <integer>的二进制搜索文本文件

时间:2014-12-02 15:52:55

标签: java binary

我对整个编程工作都很陌生,但仍然陷入困境。我过去3天一直在上课,今晚即将到期,所以非常感谢任何帮助。

说明: 您将获得一个文件,其中包含现代历史中的(半随机)年份,最早的年份是最早的。写一个程序:

  1. 读入文件

  2. 首先使用最新活动重新排序

  3. 确定1892年CMU的成立是否被视为世界历史事件

  4. 如果不是这样,请将事件添加到新的事件列表

  5. 将新的事件列表写入文件。

  6. 提示:

    选择正确的搜索方法可以让您更轻松地进行插入。

    以下是events.txt文件中列出的信息:

    1066 1095 1100 1206 1215 1260 1271 1273 1300 1347 1399 1438 1455 1492 1509 1513 1517 1519 1520 1522 1543 1582 1603 1605 1609 1637 1643 1664 1667 1684 1690 1721 1755 1760 1762 1764 1769 1776 1787年 1789年 1792 1796 1808 1815 1819 1826 1833 1842 1859年 1862年 1867年 1876年 1879年 1880 1885年 1893年 1895年 1897年 1900 1903年 1905年 1907年 1911年 1913年 1914年 1916年 1917年 1918年 1922年 1927年 1928年 1929年 1936年 1939年 1942年 1945年 1946年 1947年 1949年 1950年 1953年 1954年 1957年 1959年 1969年 1980年 1981年 1989年 1991

    这是我到目前为止的代码之一:

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Scanner;
    
    public class Assignment7 {
    
    public static void main(String[] args) throws IOException {
    
    
    
        System.out.println("Accessing Central Michigan University Historical Records...");
        System.out.println("Listing all CMU Historical Event Dates: ");
    
    
    
    
    
        Scanner file = null;
        ArrayList<Integer> list = new ArrayList<Integer>();
    
        try {
        file = new Scanner(new File("events.txt"));
        } catch (FileNotFoundException e) {
        e.printStackTrace();
        }
        while(file.hasNext()){
        if (file.hasNextInt()) list.add(file.nextInt());
        else file.next();
    
            }
    
    
    
        {
    
    
        Collections.reverse(list);
        for (Object i: list) 
            System.out.println(i);
    
    
    
    }
    }
    }
    

    任何提供的帮助都将非常感激。

    这是我得到的输出,没有我需要执行二进制搜索的最后一段代码。

    Accessing Central Michigan University Historical Records...
    Listing all CMU Historical Event Dates: 
    1991
    1989
    1981
    1980
    1969
    1959
    1957
    1954
    1953
    1950
    1922
    

    ......等等到1066

    输入下面的代码片段以尝试二进制搜索但得到消息“方法add(int,int)未定义类型Scanner”不确定如何解决此问题。就像我说的NEWB,我的意思是非常新的,第一学期用java编程。

    int key = 1892;
    int pos = Collections.binarySearch(list, key);
    if (pos < 0)
    file.add(-pos-1, key);
    

1 个答案:

答案 0 :(得分:0)

启动项目时,您应该考虑如何将其分解为多个步骤。对于此示例,我可以考虑两个重要步骤:将输入文件解析为数组,然后对数组执行二进制搜索以检查值。

由于你已经完成了第一部分,你应该创建一个新的方法来执行二进制搜索部分。

由于这是一个简介Java课程,如果您的教授希望您使用Collections.binarySearch等内置方法,我会感到非常惊讶。

这里是一个方法的伪代码,它接受一个int键和一个数组作为参数:

注意:数组应按升序排序

int low = starting index
int high = last index
while(low <= high)
    int mid = current middle index
    if(key < array[mid])
        high = mid - 1
    else if(key > array[mid])
        low = mid + 1
    else return mid 
 end while

如果mid等于您要查找的值,那么您就知道该日期在列表中。否则,它不包含在列表中。

查看您的代码:

do{
File f = new File("events.txt");
//Intro
System.out.println("Accessing Central Michigan University Historical Records...");
System.out.println("Searching for events that occurred during 1892...");
String [] targetDate = {"1892"};
Arrays.asList(targetDate).contains("1892");
    //If date is found, print.
    if(false){
        System.out.println("Date found in CMU Historical Records.");
        System.out.print(f);
    }
    //If date isn't found, notify user.
    else
        System.out.println("Date not found in CMU Historical Records.");

}

我注意到一些错误。没有理由将目标日期作为String数组。毕竟,您正在搜索int,因此您希望保持这种状态。您应该使用密钥和findDates()数组调用int方法。你的if语句也没有做你认为它正在做的事情。您想要if(year==true)代替if(true),或者更好,只需if(year)

顺便说一句,我认为Scanner没有add()方法

在这里你似乎也有一个错字:

file.add(-pos-1, key);

我认为你的意思是这样的

file.add(list.get(pos - 1), key);
但是,在这种情况下,这不是必需的。

希望这有帮助! ......相信我,它会变得更好:)。