2012-04-08 23 views
1

は、今のところ私はこのように書きテキストファイル保存したい:テキストファイルから読み込むときに数字を無視する方法は?

1リンゴを

2バナナ

3オレンジ

4オオヤマネコ

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番目のサイクルで読み取るデータはありません。 Java Collectionを使用して、動的に増加する一連の行を格納します。それらをJavaオブジェクト階層に格納する前に、それらを数える必要はありません。 –

答えて

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を使ってテキストファイルを文字列に変換する

+0

Pattern.compile( "[^ 0-9 \\ s] +")の意味は何ですか?また、それは文字列ではなくテキストファイルとして入力されるので、これを動作させるには、テキストファイルを文字列に変換する必要がありますか?お手伝いありがとう。最近、正規表現は非常に普及しています。 – flymonkey

+0

コンパイルメソッドは、検索パターンのコンパイルに使用されます。パラメータに表示される数字は、検索時に表示されないようにするためです。だから完全に安全です。 ApacheのIOUtilitiesを使ってテキストファイルをStringに変換する – GingerHead

0

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

次に、配列の2番目の要素を取ってください(最初は数字になります)。

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

注:期待したとおりに書式設定されていないと、何かエラーチェックが実行される可能性があります(Stringがフォーマットされていない場合)。あなただけカウント桁でオリジナル作品をサブストリング簡単に何かをしたい場合は

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

:しかし、このコードスニペットは、基本的なアイデアを提供します

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

word = word.substring(t); 

単語がスペースを含む決して場合もword.split(" ")[1]

を使用することができます
2

これはすでにファイルの最後にあるため動作しません。したがって、in.readLine()メソッドはnullを返します。

私は...名前と金額を保存するために、このような地図を使用します。そうしないとあなたはScannerクラスでそれを試すことができます

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])); 
} 

を。がんばろう。

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)); 
} 

出力=

リンゴ

オレンジ

正規表現Java regex tutorialについてのアイデアを得るために。

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; 
    } 

} 
 
0

Iそうのように、バッファリーダーはScannerクラスを使用して使用して、代わりの配列は、ArrayListのを使用して使用しての nstead:

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); 
} 
関連する問題