Java 合并排序。错误--类型不匹配:无法从双精度转换为字符串
下面的程序使用合并排序来排列文件中的前10000个单词。我遵循托马斯·科尔曼在《算法导论》第二版中的伪代码Java 合并排序。错误--类型不匹配:无法从双精度转换为字符串,java,file-io,mergesort,type-mismatch,Java,File Io,Mergesort,Type Mismatch,下面的程序使用合并排序来排列文件中的前10000个单词。我遵循托马斯·科尔曼在《算法导论》第二版中的伪代码 import java.io.*; import java.util.*; public class SortingAnalysis { public static void merge(String[] A, int p, int q, int r) { int n1 = q-p+1; int n2 = r-q; double
import java.io.*;
import java.util.*;
public class SortingAnalysis {
public static void merge(String[] A, int p, int q, int r) {
int n1 = q-p+1;
int n2 = r-q;
double infinity = Double.POSITIVE_INFINITY;
int i, j;
String[] L = null;
String[] R = null;
for (i=1; i<=n1; i++) {
L[i] = A[(int) (p+i-1)];
}
for (j=1; j<=n2; j++) {
R[j] = A[(int) (q+j)];
}
L[n1+1] = infinity; //type mismatch: cant convert from double to string
R[n2+1] = infinity; //same as above
i=1;
j=1;
for (int k=(int) p; k<=r; k++) {
int comparison = L[i].compareTo(R[j]);
if (comparison<=0) {
A[k] = L[i];
i++;
}
else {
A[k] = R[j];
j++;
}
}
}
public static void mergeSort(String[] A, int p, int r) {
if (p<r) {
int q = (int) Math.floor((p+r)/2); //I typecasted q here so I can still pass the variables
mergeSort(A, p, q);
mergeSort(A, q+1, r);
merge(A, p, q, r);
}
}
public static void main(String[] args) {
final int NO_OF_WORDS = 10000;
try {
Scanner file = new Scanner(new File(args[0]));
String[] words = new String[NO_OF_WORDS];
int i = 0;
while(file.hasNext() && i < NO_OF_WORDS) {
words[i] = file.next();
i++;
}
long start = System.currentTimeMillis();
mergeSort(words, 0, words.length-1);
long end = System.currentTimeMillis();
System.out.println("Sorted Words: ");
for(int j = 0; j < words.length; j++) {
System.out.println(words[j]);
}
System.out.print("Running time of insertion sort: " + (end - start) + "ms");
}
catch(SecurityException securityException) {
System.err.println("Error");
System.exit(1);
}
catch(FileNotFoundException fileNotFoundException) {
System.err.println("Error");
System.exit(1);
}
}
}
import java.io.*;
导入java.util.*;
公共类排序分析{
公共静态无效合并(字符串[]A,int p,int q,int r){
int n1=q-p+1;
int n2=r-q;
双无穷大=双正无穷大;
int i,j;
字符串[]L=null;
字符串[]R=null;
对于(i=1;i而言,对(int)
进行强制转换无论如何都会产生地板效果
L[n1+1] = infinity; //type mismatch: cant convert from double to string
这是一个错误,因为即使使用toString()
将adouble
转换为String
,也无法将其转换为double
,这将是不正确的,因为您只会得到“NaN”,它不是您的目标字符串的maixmum值
您可以在不添加虚拟“无穷大”值的情况下对其进行编码,我建议您改为这样做。对(int)
进行强制转换将产生地板效果
L[n1+1] = infinity; //type mismatch: cant convert from double to string
这是一个错误,因为即使使用toString()
将adouble
转换为String
,也无法将其转换为double
,这将是不正确的,因为您只会得到“NaN”,它不是您的目标字符串的maixmum值
您可以在不添加虚拟“无穷大”值的情况下编写此代码,我建议您这样做
我想这是因为Math.floor方法应该是一个double,但我确实将它键入int,所以在传递参数时不会有问题
不,比这简单。您试图将一个双精度值赋给一个字符串数组。您不能这样做
我强烈怀疑您应该将整个代码更改为使用double[]
而不是String[]
。请注意,即使在编译时(在真正修复所有编译错误之前,您不应该尝试运行它),您也会遇到以下问题:
String[] L = null;
String[] R = null;
for (i=1; i<=n1; i++) {
L[i] = A[(int) (p+i-1)];
}
以基于1的方式使用数组是很奇怪的,顺便说一句,这样做会更加习惯:
double[] L = new double[n1 + 1];
double[] R = new double[n1 + 1];
for (i=1; i<=n1; i++) {
L[i] = A[(int) (p+i-1)];
}
double[] L = new double[n1];
double[] R = new double[n1];
for (i = 0; i < n1; i++) {
L[i] = A[p + i];
}
double[]L=新的双精度[n1];
double[]R=新的double[n1];
对于(i=0;i
感觉上你在挣扎,因为你试图在这里学到两件事:
- 合并排序的工作原理
- Java的工作原理
我将首先专注于理解Java语言——在这一点上,您将能够更好地将伪代码转换为真实代码
我想这是因为Math.floor方法应该是一个double,但我确实将它键入int,所以在传递参数时不会有问题
不,比这简单。您试图将一个双精度值赋给一个字符串数组。您不能这样做
我强烈怀疑您应该将整个代码更改为使用double[]
而不是String[]
。请注意,即使在编译时(在真正修复所有编译错误之前,您不应该尝试运行它),您也会遇到以下问题:
String[] L = null;
String[] R = null;
for (i=1; i<=n1; i++) {
L[i] = A[(int) (p+i-1)];
}
以基于1的方式使用数组是很奇怪的,顺便说一句,这样做会更加习惯:
double[] L = new double[n1 + 1];
double[] R = new double[n1 + 1];
for (i=1; i<=n1; i++) {
L[i] = A[(int) (p+i-1)];
}
double[] L = new double[n1];
double[] R = new double[n1];
for (i = 0; i < n1; i++) {
L[i] = A[p + i];
}
double[]L=新的双精度[n1];
double[]R=新的double[n1];
对于(i=0;i
感觉上你在挣扎,因为你试图在这里学到两件事:
- 合并排序的工作原理
- Java的工作原理
我会先专注于理解Java语言-在这一点上,您将能够更好地将伪代码转换为真实代码。谢谢您,Jon!作为一名新手,我很开明,谢谢!也许我会对代码进行一些重大修改。:)谢谢你,Jon!作为一个新手,我很开明,谢谢你!也许我会对我的代码做一些重大修改。:)谢谢你提供的信息,Peter!我很感激!也许我会对我的代码做一些修改。谢谢你提供的信息,Peter!我很感激!也许我会对我的代码做一些修改。