请原谅我,如果这看起来很基本/已经回答,但我不明白如何将它应用到我的程序中。我试图创建一个程序,接受来自文本文件的整数或字符串数组,然后在排序类中使用isBetterThan()
方法对其他类进行排序。
如何逐行接受来自文本文件的输入以创建IntegerType或StringType数组? (整数/字符串和文件将是用户输入。)
当它坐下时,我得到的错误是“#34;没有合适的方法"对于数组类或"不兼容的类型"。感谢。
import java.util.ArrayList;
import java.util.Scanner;
import java.io.*;
public class Insert
{
public static void main(String[] args) throws IOException {
//Variables
String fileName;
IntegerType line;
ArrayList<IntegerType> aList = new ArrayList<IntegerType>();
//Ask for which file
Scanner scan = new Scanner (System.in);
System.out.print ("Enter the pathname of the input file: ");
fileName = scan.nextLine();
Scanner s = new Scanner(new File(fileName));
//--------------------My problem
while (s.hasNext()){
aList.add(s.next());
}
s.close();
}
}
class IntegerType implements AnyType {
private int number;
public IntegerType() {
number = 0;
}
public IntegerType(int i) {
number = i;
}
public boolean isBetterThan(AnyType datum) {
return (this.number > ((IntegerType)datum).number);
}
public int toInteger() {
return number;
}
}
class StringType implements AnyType {
private String word;
public StringType(){
word = "";
}
public StringType(String s){
word = s;
}
public boolean isBetterThan(AnyType datum) {
return (this.word.compareTo(((StringType)datum).word) > 0);
}
public String toString() {
return word;
}
}
interface AnyType {
public boolean isBetterThan(AnyType datum);
}
答案 0 :(得分:0)
根据您的代码,您的文件包含整数,并且您尝试逐个读取每个标记并将其添加到带有Integer类型的ArrayList。
让我们看看您尝试在当时读取文件的部分
while (s.hasNext()){
aList.add(s.next());
}
让我们分解
s.hasNext()
的含义是什么?
public boolean hasNext()
如果此扫描器的输入中有另一个标记,则返回true。这个 方法可能会在等待输入扫描时阻塞。扫描仪没有 超越任何输入。指定者:接口中的hasNext 类型为String的迭代器
s.next()
的含义是什么?
public String next()
&lt; --- ,因为您看到它返回类型字符串
查找并返回此扫描程序中的下一个完整令牌。在完成令牌之前和之后是与分隔符模式匹配的输入。即使之前的hasNext()调用返回true,此方法也可能在等待输入扫描时阻塞。
我相信当您尝试将String添加到Integer类型的ArrayList时问题唉...
listInt.add(in.next());
好消息您可以使用
解析in.next()
类型的String
以Integer
类型
Integer.parseInt(whatever you want to conver to type Integer);
你的while循环将改为
while (in.hasNext()) {
String token = in.next();
listInt.add(Integer.parseInt(token));
}
用于验证目标,以查看您的输入是字符串还是整数
try {
Integer.parseInt(text);
return true;
} catch (NumberFormatException e) {
return false;
}
尝试此示例以区分String和Integer类型
public static void main(String[] args) {
String s = "1 a b 2";
String[] sp = s.split(" ");
for (int i = 0; i < sp.length; i++) {
if(stringOrInteger(sp[i]))
System.out.println(sp[i] + " is type Integer");
else
System.out.println(sp[i] + " is type String");
}
}
private static boolean stringOrInteger(String s) {
try {
Integer.parseInt(s);
return true;
} catch (NumberFormatException e) {
return false;
}
}
输出:
1 is type Integer
a is type String
b is type String
2 is type Integer
我没有看到你有一个包装类名IntegerType:
您可以使用hasNextInt从文件中读取每个标记,因为它们的类型为int
public boolean hasNextInt()
如果此扫描程序输入中的下一个标记可以,则返回true 使用nextInt()解释为默认基数中的int值 方法。扫描仪不会超过任何输入。
因为你的包装器类中有构造函数
IntegerType it = new IntegerType(variable type int goes here);
如何读取变量类型int?
使用nextInt()
表示将输入的下一个标记扫描为int。
所以你的while循环变为:
List<IntegerType> listInt = new ArrayList<>();
while (in.hasNextInt()) {
IntegerType it = new IntegerType(in.nextInt());
listInt.add(it);
}
并且要打印变量,必须使用包装类
中的toInteger() for (int i = 0; i < listInt.size(); i++) {
System.out.print(" " + listInt.get(i).toInteger());
}
输出:
70 35 81 8 96 64 46 57 99 19
文件内容:
70 35 81 8 96 64 46 57 99 19