现在我想存储一个这样的文本文件:
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) {
}
}
}
提前感谢您的帮助!!
答案 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);
}