如何从程序输入为IntegerType的文件创建一个arraylist?

时间:2014-09-23 00:59:03

标签: java arraylist

请原谅我,如果这看起来很基本/已经回答,但我不明白如何将它应用到我的程序中。我试图创建一个程序,接受来自文本文件的整数或字符串数​​组,然后在排序类中使用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);
}

1 个答案:

答案 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()类型的StringInteger类型
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