线程 "main"java.lang.NegativeArraySizeException : -28 中的 Java ArrayList 异常

标签 java csv sorting timsort

我对排序算法有疑问。我正是使用这个 TimSort 进行排序 https://www.geeksforgeeks.org/timsort/ ( java )。例如,我正在循环读取前 2500 行的 CSV 文件。

这是我的阅读代码:

    private void readFile(){
        try{
            int i = 0;
            BufferedReader csvReader = new BufferedReader(new FileReader(this.filename));
            while ((row = csvReader.readLine()) != null){
                String[] entry = row.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1);
                if(i > 0 && i <= 2500){
                    int price = Integer.parseInt(entry[5]);
                    entries.add(price);
                }
                i++;
            }
            csvReader.close();

        }catch(Exception e){
            e.printStackTrace();
        }
    }

之后,我通过这种方式将字符串转换为 int[] Arraylist:

public int[] convertArrayList(){
    ArrayList<Integer> arrayList = this.entries;
    int[] converted = new int[arrayList.size()];
    for(int i=1; i < converted.length; i++){
        converted[i] = arrayList.get(i);
    }
    return converted;
}

我的主要内容是:

    private static synchronized void getPrices(){
        try{
            File dataset = new File("src/CSV/Schools.csv");
            CSVReader reader = new CSVReader(dataset.getCanonicalPath());
            prices = reader.convertArrayList();
        } catch(Exception e){
            e.printStackTrace();
        }
    }

并运行它:

    getPrices();
    int n = prices.length;
    System.out.println(n);

    Instant start = Instant.now();
    System.out.print("Given Array is\n");
    GFG.printArray(prices, n);
    Instant end = Instant.now();

    System.out.println("Time for executing the unsorted array: " + Duration.between(start, end).toNanos());


    GFG.timSort(prices, n);

    Instant start2 = Instant.now();
    System.out.print("\nAfter Sorting Array is\n");
    GFG.printArray(prices, n);
    Instant end2 = Instant.now();

    System.out.println("Time for executing the sorted array: " + Duration.between(start2, end2).toNanos());

现在事情是这样的 如果我运行此代码并将循环更改为 i > 0 && i <= 1000 它就可以工作。但如果我采用更大的数字,例如 2500 或 5000,则会出现以下错误:

Exception in thread "main" java.lang.NegativeArraySizeException: -28
at GFG.merge(TimSort.java:32)
at GFG.timSort(TimSort.java:111)
at Main.main(Main.java:27)

它引用了 TimSort 算法中的合并方法...我无法解决这个问题,有什么想法吗?

最佳答案

可能是因为您链接到的 TimSort 算法实现存在错误。

List.sortCollections.sortArrays.sort(T[]) 都已使用 timsort。无需从随机站点复制代码即可使用 TimSort。实用程序方法 java.util.Arrays.sort(int[]) 使用双枢轴排序。我认为它具有更好的性能特征,因此可以用来代替 timsort。

如果您想了解链接到的 timsort 代码,请忘记您粘贴的所有代码,专注于链接到的 timsort impl,然后进行调试。

关于线程 "main"java.lang.NegativeArraySizeException : -28 中的 Java ArrayList 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59513371/

相关文章:

java - 静态与新对象

c# - csv特殊字符的问题

unix - CSV - 删除任何列为空的行

csv - Linux外壳: Detecting state changes on a CSV log file

c# - IComparer 不对简单的 a b c 进行排序?

java - 在这一小段 Android 代码中,我在哪里遗漏了 { 或 }?

java - Tomcat 7 : Invalid mapping (java. lang.IllegalArgumentException)

c# - 订购字典

algorithm - 查找既不是第 k 个最大值也不是第 k 个最小值的元素的时间复杂度?

java - 为什么这不会产生歧义?