【问题标题】:Java: Errors in a Program?Java:程序中的错误?
【发布时间】:2014-02-04 22:59:31
【问题描述】:

编写一个读取实数列表的程序。程序结束后,它应该只打印出唯一的数字。也就是说,只有在列表中出现一次的数字。如果列表中有超过 50 个唯一编号,那么您应该只打印前 50 个。 代码:

import java.util.*;
import java.io.*;
import java.util.Arrays;


public class Hmwk {

public static void main(String[] args) throws FileNotFoundException {
    Scanner input=new Scanner (new File ("input.txt"));
    int n = 0;
    double[] numbersArray = new double[100000];
    while (input.hasNextDouble()){
        double in = input.nextDouble();
        numbersArray[n]=in;
        n++;
    }
    Arrays.sort(numbersArray);
    inList(numbersArray);
    double[] uniqueArray = Arrays.copyOfRange(numbersArray, 0, n);
    printReport(uniqueArray);
}


public static double[] inList(double[] list){
    int position = 0;
    final int MAX_SIZE = 50;
    double [] uniqueArray = new double[MAX_SIZE];
    for (int i = 0; i < list.length; i++){
        for (int j = 1; j < list.length; j++){
            if (list[i] != list[j]){
                uniqueArray[position]= i;
                position++;
            }
            }
        }
    return uniqueArray;
    }



public static void printReport(double[] list)
{
    System.out.println("The unique numbers were");
    System.out.println(Arrays.toString(list));

}


}

在创建一个新算法并再次阅读我的书后,我想出了上面的代码来解决顶部解释的问题。我试图对从 input.txt 中引入的数组中的所有数字进行排序。然后我尝试使用 inList 比较数字的索引。我试图让它比较索引 [0] 和 [1]、[1] 和 [2],等等。作为一个排序列表,如果被比较的索引处的数字相等,则它不是列表的唯一编号,但如果它们不同,则它们是唯一编号并添加到 uniqueArray。但是,当我运行它时出现以下错误。

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 50
at Hmwk.inList(Hmwk.java:33)
at Hmwk.main(Hmwk.java:20)

对我有什么想法吗?和往常一样,我非常感谢您的宝贵时间。

【问题讨论】:

  • list 是一个包含 50,000 个元素的数组,您从 0 循环到 list.length,但 uniqueArray 仅包含 50 个元素。所以,是的,你会碰到一个超出范围的数组索引。
  • 如何从 [0] 循环到列表中的最后一个 double 而不是 0.0?
  • 那么,如果您有一个包含 10,000 个 3 的列表,后跟不同的数字,您的程序是否应该找到所有不同的数字?或者,它只会返回 3?我不清楚这项任务。

标签: java arrays sorting for-loop indexing


【解决方案1】:

您的numbersArray 定义的元素比您的uniqueArray 多:

double[] numbersArray = new double[100000];

和

final int MAX_SIZE = 50;
double [] uniqueArray = new double[MAX_SIZE];

和

// list is in this case your numbersArray
for (int i = 0; i < list.length; i++){
    for (int j = 1; j < list.length; j++){
        if (list[i] != list[j]){
            uniqueArray[position]= i;  // ArrayIndexOutOfBoundsException
            position++;
        }
    }
}

当 position 达到 50 时,这会崩溃,因为你的 uniqueArray 只有 50 个以 0 开头的元素,所以 49 是这里的最后一个索引。

【讨论】:

    【解决方案2】:

    这一行是你的问题:

    uniqueArray[position]= i;
    position++;
    

    位置不断增加并达到 50。

    【讨论】:

      【解决方案3】:

      您应该使用容器类。以双 AS 键和整数作为计数器的 HashMap。或 Double 的 LinkedList。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-15
        • 2016-10-16
        • 1970-01-01
        • 1970-01-01
        • 2013-11-12
        相关资源
        最近更新 更多