从文本文件中读取时如何忽略数字?

时间:2012-04-08 18:07:02

标签: java arrays file-io arraylist

现在我想存储一个这样的文本文件:

1个苹果

2香蕉

3橙色

4 lynx

5卡布奇诺

等等进入数据结构。这样做的最好方法是将int以某种方式映射到字符串,还是应该创建一个arraylist?当我存储单词本身时,我应该忽略int和任何空格,并且只保留单词本身。在读行时如何忽略int?这是我现在被黑客攻击的代码:

  public Dictionary(String filename) throws IOException {
  if (filename==null)
      throw new IllegalArgumentException("Null filename");
  else{
      try {
            BufferedReader in = new BufferedReader(new FileReader(filename));
            String str;
            int numLines=0;
            while ((str = in.readLine()) != null) {
                numLines++;
            }
            String[] words=new String[numLines];
            for (int i=0; i<words.length;i++){
                words[i]=in.readLine();
            }

            in.close();
        } catch (IOException e) {
    }
  }

}

提前感谢您的帮助!!

7 个答案:

答案 0 :(得分:2)

这不起作用,因为你已经在文件的末尾,所以in.readLine()方法将返回null。

我会使用Map来存储名称和金额......就像这样:

HashMap<String, Integer> map = new HashMap<String, Integer>();

while( (line = br.readLine() !=null){
    //also check if the array is null and the right size, trim, etc.
    String[] tmp = line.split(" ");
    map.put(tmp[1], Integer.parseInt(tmp[0]) );
}

否则您可以使用Scanner类进行尝试。祝你好运。

答案 1 :(得分:2)

您可以尝试regular expressions

Pattern p = Pattern.compile("[^0-9\\s]+");
String s = "1 apple 2 oranges";

Matcher m = p.matcher(s);

while (m.find()) {
  System.out.println(m.group(0));
}

输出=

  

apple

     

桔子

了解正则表达式Java regex tutorial

答案 2 :(得分:2)

只需实现正则表达式的强大功能:

List texts<String> = new ArrayList<String>();
Pattern pattern = Pattern.compile("[^0-9\\s]+"); 
String text = "1 apple 2 oranges 3 carrots"; 
Matcher matcher = pattern.matcher(text); 

while (matcher.find()) { 
  texts.add(matcher.group(0)); 
} 

正则表达式如今非常受欢迎。编译方法用于编译搜索模式,您在参数中看到的数字是为了防止在搜索中获取它们。所以这是完全安全的。使用apache的IOUtilities将文本文件转换为String

答案 3 :(得分:2)

我建议您使用List项来存储从文件中解析的结果。解析每个文本行的一种方法是使用String.split(String)方法。另请注意,您应该正确处理代码中的异常,并且在完成后不要忘记关闭Reader(无论是完美无缺还是异常=&gt;使用finally块)。以下示例应该让您按计划进行...希望这会有所帮助。


package test;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;


public class Main {

  public static void main(String[] args) throws IOException {
    Main m = new Main();
    m.start("test.txt");
  }

  private void start(String filename) throws IOException {
    System.out.println(readFromFile(filename));
  }

  private final class Item {
    private String name;
    private int id;
    public Item(String name, int id) {
      this.name = name;
      this.id = id;
    }
    public int getId() {
      return id;
    }
    public String getName() {
      return name;
    }
    @Override
    public String toString() {
      return "Item [name=" + name + ", id=" + id + "]";
    }
  }

  private List<Item> readFromFile(String filename) throws IOException {
    List<Item> items = new ArrayList<Item>();
    Reader r = null;
    try {
      r = new FileReader(filename);
      BufferedReader br = new BufferedReader(r);
      String line = null;
      while ((line = br.readLine()) != null) {
        String[] lineItems = line.split(" ");
        if (lineItems.length != 2) {
          throw new IOException("Incorrect input file data format! Two space separated items expected on every line!");
        }
        try {
          int id = Integer.parseInt(lineItems[0]);
          Item i = new Item(lineItems[1], id);
          items.add(i);
        } catch (NumberFormatException ex) {
          throw new IOException("Incorrect input file data format!", ex); // JDK6+
        }
      }
    } finally {
      if (r != null) {
        r.close();
      }
    }
    return items;
  }

}

答案 4 :(得分:0)

如果您的字词不包含空格,则可以使用String.split( " " )String拆分为由空格分隔的Strings数组。

然后只取数组的第二个元素(第一个是数字)。

此外,String.trim( )方法将删除String之前或之后的任何空格。

注意:您可能需要执行一些错误检查(如果String未按预期格式化,该怎么办)。但是这段代码片段给出了基本的想法:

...
String s = in.readLine( );
String[] tokens = s.split( " " );
words[i] = tokens[1].trim( );
...

答案 5 :(得分:0)

如果你想做一些简单的事情,只需通过计算数字来对原始作品进行子串:

int t = 0;
while (word.charAt(t) >= '0' && word.charAt(t) <= '9')
  ++t;

word = word.substring(t);

如果单词不包含空格,您也可以使用word.split(" ")[1]

答案 6 :(得分:0)

而不是使用缓冲区阅读器使用Scanner类而不是使用Array使用ArrayList,如下所示:

import java.util.Scanner;
import java.util.ArrayList;

public class Dictionary {
  private ArrayList strings = new ArrayList();

code...

public Dictionary(String fileName) throws IOException {

code...

try {
  Scanner inFile = new Scanner(new fileRead(fileName));

  ArrayList.add("Dummy"); // Dummy value to make the index start at 1
  while(inFile.hasNext()) {
    int n = inFile.nextInt(); // this line just reads in the int from the file and
                              // doesn't do anything with it
    String s = inFile.nextLine().trim();

    strings.add(s);
    }
  inFile.close(); // don't forget to close the file
}

然后由于您的数据分别为1,2,3,4,5,您只需使用索引来检索每个项目的编号。

通过这样做:

for(int i = 1; i < strings.size(); i++) {
int n = i;
String s = n + " " + strings.get(i);
System.out.println(s);
}