java - 如何修复名称排序器? NoSuchElementFound 错误...?

标签 java sorting debugging

我编写了姓名排序程序,旨在对姓名列表进行排序(废话)并给出我姓名的索引值。由于某种原因,它编译得很好,但说“maleNames[i] = nameScan.nextLine();”有问题,并返回以下消息:

java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Scanner.java:1540)
    at NameSorter.main(NameSorter.java:14)

有什么想法或修复吗?提前致谢!

import java.io.*;
import java.util.Scanner;
public class NameSorter
{
    public static void main(String [] args) throws FileNotFoundException
    {
        String [] maleNames = new String[1220];
        PrintStream ps = new PrintStream("sorted_male_names.txt");

        Scanner nameScan = new Scanner(new File("common_male_names.txt"));

        for (int i = 0; i < maleNames.length; i++)
        {
            maleNames[i] = nameScan.nextLine();
        }

        bubbleSort(maleNames);

        for (int i = 0; i < maleNames.length; i++)
        {
            System.out.println(maleNames[i]);
        }

        for (int i = 0; i < maleNames.length; i++)
        {
            String currentName = maleNames[i];
            ps.println(currentName);
        }

        System.out.println(linearSearch(maleNames, "zander"));
    }

    public static boolean isSorted(String[] arr)
    {
        for (int i = 0; i < arr.length -1; i++)
        {
            if (arr[i].compareTo(arr[i+1]) > 0)
                return false;
            }
        return true;
    }

    public static void swapElements(String[] arr, int index1, int index2)
    {
        String tempValue = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = tempValue;
    }

    public static void bubbleSort(String[] arr)
    {
        while(isSorted(arr) == false) // while(!isSorted(arr)) 
        {
        for (int i = 0; i < arr.length - 1; i++)
        {
            if (arr[i].compareTo(arr[i+1]) > 0)
            swapElements(arr, i, i+1);
        }
        }
    }

    public static int linearSearch(String[] arr, String name)
    {
        for (int i = 0; i > arr.length; i++)
        {
            if (arr[i].equals(name))
            return i;
        }
        return -1;
    }

    public static void printArray(int[] arr)
    {
        for (int i = 0; i < arr.length; i++)
        {
            System.out.print(arr[i] + " ");
        }
    }
}

最佳答案

你的for循环

for (int i = 0; i < maleNames.length; i++) {
        maleNames[i] = nameScan.nextLine();
}

假设有maleNames.length文件中的元素(在本例中为 1220)如果少于该数量,您将得到 NoSuchElementException

更好的方法是使用扫描仪的 hasNextLine()方法和List<String>

List<String> maleNames = new ArrayList<>();

while(nameScan.hasNextLine()) { 
    maleNames.add(nameScan.nextLine());
}

这将允许任何长度的名称文件,只要其格式正确即可,并避免出现异常。

关于java - 如何修复名称排序器? NoSuchElementFound 错误...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26965509/

相关文章:

java - Spring MVC 将空白 View 返回给用户

wordpress - 在 Wordpress REST API 中按菜单顺序排序?

java - 快速排序不对长度为 2 的数组进行排序

java - 确保方法被调用

java - 使用 URL.openConnection() 时,处理 "www"和 "https"等 URL 变化的最佳方法是什么?

java - 如何显示另一个类(class)的内容

在容器类中使用自定义比较器的 C++ 排序集

javascript - Firefox 重新加载页面循环调试提示?

C语言中单个指针可以指向多个指针吗?

c# - 使用 Windows 调试器调试 C# 源代码