1

今、私はこのようなテキストファイルを保存したいと思います:

リンゴ1個

2バナナ

3オレンジ

4オオヤマネコ

5カプチーノ

などをデータ構造に変換します。これを行う最良の方法は、intを文字列にマッピングすることですか、それとも配列リストを作成する必要がありますか?単語自体を格納するときは、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) {
    }
  }

}

よろしくお願いします!!

4

7 に答える 7

2

すでにファイルの最後にいるため、これは機能しません。そのため、in.readLine()メソッドはnullを返します。

私はマップを使用して名前と金額を保存します...次のようなものです:

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クラスで試すことができます。幸運を。

于 2012-04-08T18:14:34.990 に答える
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));
}

出力=

りんご

オレンジ

正規表現についてのアイデアを得るにはJavaregexチュートリアル

于 2012-04-08T18:16:39.590 に答える
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)); 
} 

最近、正規表現が非常に人気があります。compileメソッドは、検索パターンのコンパイルに使用されます。パラメーターに表示される数値は、検索でそれらが取得されないようにするためのものです。だからそれは完全に安全です。apacheのIOUtilitiesを使用して、テキストファイルを文字列に変換します

于 2012-04-08T18:22:55.930 に答える
2

Listアイテムのを使用して、ファイルから解析された結果を保存することをお勧めします。すべてのテキスト行を解析する1つの方法は、String.split(String)メソッドを使用することです。また、コード内の例外を適切に処理する必要があり、完了したら閉じることを忘れないでくださいReader(問題がないか、例外があるかどうかに関係なく=>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;
  }

}

于 2012-04-08T18:33:30.687 に答える
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);
}
于 2012-04-08T18:41:08.353 に答える
0

単語にスペースが含まれていない場合は、をスペースで区切られた配列にString.split( " " )分割するために使用できます。StringStrings

次に、配列の2番目の要素を取得します(最初の要素は数値になります)。

また、このString.trim( )メソッドは、の前後の空白をすべて削除しますString

注:実行したいエラーチェックが発生している可能性があります(String期待どおりにフォーマットされていない場合はどうなりますか)。しかし、このコードスニペットは基本的な考え方を示しています。

...
String s = in.readLine( );
String[] tokens = s.split( " " );
words[i] = tokens[1].trim( );
...
于 2012-04-08T18:12:50.640 に答える
0

簡単なことをしたい場合は、数字を数えて元の作業をサブストリングするだけです。

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

word = word.substring(t);

単語にスペースが含まれていない場合は、使用することもできますword.split(" ")[1]

于 2012-04-08T18:13:50.427 に答える