编译错误 - 反转计数算法

Compilation error - Inversions counting algorithm

我在我的代码中遇到错误。

这是我得到的错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:

The method recur(Integer[]) in the type D_and_con is not applicable for the arguments (int[])

at edu.uqu.algorithms.inversions.D_and_con.recur(D_and_con.java:27)
at edu.uqu.algorithms.inversions.MainTest.main(MainTest.java:27)

代码计算反转次数。

是:

package edu.uqu.algorithms.inversions;

import java.io.FileNotFoundException;
import java.util.Arrays;

import edu.uqu.algorithms.inversions.util.IOUtil;

public class MainTest {

    public static void main(String[] args) {

        try {

            /*//Inversions using BRUTE FORCE
            Integer[] tokens1 = IOUtil.loadFileIntoArray("IntegerArray.txt");
            long startTime1 = System.currentTimeMillis();
            System.out.println("Started Computing Total nb of invertions BRUTE FORCE..........................");
            System.out.println("Total nb of invertions BRUTE FORCE: " + Inversions.countInvertionsBruteForce(tokens1));
            long runningTime1 = (System.currentTimeMillis() - startTime1);
            System.out.println("BRUTE FORCE Running time: " + runningTime1);
            System.out.println("\n");*/

            //Inversions using DIVIDE & CONQUER
            Integer[] tokens2 = IOUtil.loadFileIntoArray("IntegerArray.txt");
            long startTime2 = System.currentTimeMillis();
            System.out.println("Started Computing Total nb of invertions DIVIDE & CONQUER..........................");
            System.out.println("MMMMM" + D_and_con.recur(tokens2) );
            long runningTime2 = (System.currentTimeMillis() - startTime2);
            System.out.println("DIVIDE & CONQUER Running time: " + runningTime2);


            System.out.println("----------------------- FINISHED -------------------------");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

}
----------------------------------------
/************************************
 *  
 *  The aim of this code is to count the number of inversions in 
 *  an array of integers. Two ways of counting are used, a Brute Force algorithm and 
 *  a recursive Divide and Conquer algorithm.
 *  
 ***********************************/

package edu.uqu.algorithms.inversions;

/**
public class Inversions{


/**
 * Brute force inversions counting method.
 */
public static long countInvertionsBruteForce(Integer[] entries_p)
{
    long result = 0;
    for(int i = 0; i < entries_p.length; i++){
        for(int j = i+1; j < entries_p.length; j++){
            if(entries_p[i] > entries_p[j]) result++;
        }
        //System.out.println("BRUTE FORCE intermediate result for i = " + i + " IS: " + result);
    }
    return result;
}

}
--------------------------
Divide and conquer
/************************************
 *  
 *  The aim of this code is to count the number of inversions in 
 *  an array of integers. Two ways of counting are used, a Brute Force algorithm and 
 *  a recursive Divide and Conquer algorithm.
 *  
 ***********************************/

package edu.uqu.algorithms.inversions;

import java.math.BigDecimal;

public class D_and_con{
    private static BigDecimal totalcount = new BigDecimal(0);
    public static Integer[] recur(Integer[] entries_p)
    {
    int n = entries_p.length;
    if(n == 1) 
    {
    return entries_p;   
    }
    int middel = n/2;
    int[] Larray = new int[middel];
    int[] Rarray = new int[n - middel];
    System.arraycopy(entries_p , 0 , Larray, 0 , Larray.length );
    System.arraycopy(entries_p , Larray.length , Rarray , 0 , Rarray.length);
    recur(Larray);\ERROR APPEAR HERE 
    recur(Rarray);\ERROR APPEAR HERE 
    comb(Larray , Rarray , entries_p );
    return entries_p;
    }

    private static void comb(int[] Larray, int[] Rarray, Integer[] newarray)
    {
        int LarrayL = Larray.length;
        int RarrayL = Rarray.length;
        int i=0 , j=0 , k=0 ;
        while(i< LarrayL && i<RarrayL)
            {
                if(Larray[i] < Rarray[i] )
                {
                newarray[k] = Larray[i];
                i++;
                }

                else
                {
                    newarray[k] = Rarray[j];
                    i++;
                totalcount = totalcount.add (new BigDecimal(Larray.length - 1));

                }
                k++;
            }
            while(i < LarrayL) {
            newarray[k] = Larray[i];
            i++;
            k++;
          }
          while(j < RarrayL) {
            newarray[k] = Rarray[j];
            j++;
            k++;
          }

    }
}

将您的 Integer[] 个数组更改为 int[] 个数组!

"int" 是原始数据类型,"Integer"Class.

解决您的问题:-

1 - Integer[] tokens2 = IOUtil.loadFileIntoArray("IntegerArray.txt"); //Read data from file in int[].

2 - Integer[] recur(Integer[] entries_p){} //change it as int[] recur(int[] entries_p) 

说明

编译器抱怨您向 recur 方法提供类型 int[] 的内容,但您声明它接受 Integer[]。因此看看方法签名

// entries_p is Integer[], not int[]
public static Integer[] recur(Integer[] entries_p)

但是您使用 int[] 提供方法,如此处所示

int[] Larray = new int[middel];
int[] Rarray = new int[n - middel];

...

recur(Larray);
recur(Rarray);

Integer 不同于 int。虽然 Java 可以自动将两者相互转换 (boxing) 但它 不会那样做 对于像数组这样的高级类型 Integer[]int[].


正在转换

您需要自己转换类型。请注意,与 int[] 相比,Integer[] 能够存储 null.

这里有一些简单的转换,首先不使用流:

// from int[] to Integer[]
int[] source = ...
Integer[] target = new Integer[source.length];

for (int i = 0; i < source.length; i++) {
    // Convert int to Integer
    target[i] = Integer.valueOf(source[i]);
}

// from Integer[] to int[]
Integer[] source = ...
int[] target = new int[source.length];

for (int i = 0; i < source.length; i++) {
    if (source[i] == null) {
        // Don't support null values
        throw IllegalArgumentException();
    }

    // Convert Integer to int
    target[i] = source[i].intValue();
}

现在同样使用 Streams (Java 8):

// from int[] to Integer[]
int[] source = ...
Integer[] target = Arrays.stream()  // IntStream
    .boxed()                        // Stream<Integer>
    .toArray(Integer[]::new)

// from Integer[] to int[]
Integer[] source = ...
int[] target = Arrays.stream()    // Stream<Integer>
    .mapToInt(Integer::intValue)  // Stream<Integer>
    .toArray(int[]::new)

改变方法或参数

除了将数组从一种类型转换为另一种类型之外,您还可以调整您的方法或参数。例如,您可以将方法签名从

public static Integer[] recur(Integer[] entries_p)

public static Integer[] recur(int[] entries_p)

然后它将接受 int[] 作为参数。您也可以将 return 类型更改为 int[]。如前所述,另一种选择是将参数从 int[] 更改为 Integer[]。这适用于该代码部分:

// You may change both to Integer[]
int[] Larray = new int[middel];
int[] Rarray = new int[n - middel];