2016-04-11 9 views
1

バッファ付きのテキストファイルから配列を作成しようとしています。このクラスは、メインメソッドを持つ別のクラスによって使用されます。私が持っているのはファイルを印刷するだけです...私が必要とするのは、テキストファイルをミラーリングしながら、行ごとに作成された文字列の配列を持つことです。私はその配列に対して、ユーザー入力からのストリングを使用して検索する必要があります(その部分もメインメソッドになります)。これは製品に名前を付け、対応する価格を見つけます。 ArrayList、Maps、Vectorsなどを使うことはできません。これはJava8にあります。/** * BufferedReaderの を使用してvmMix1テキストファイルからインベントリに読み込むクラス* @著者ミシェルメリット */コレクションクラスなしでテキストファイルから文字列配列を構築する

import java.io.*; 

public class VendingMachine1 
{ 
    BufferedReader inInvFile1 = new BufferedReader(
       new FileReader("vmMix1.txt")) 
/** 
* A method to print vending machine 1 inventory 
*/ 
    public void printVM1() 
    { 
     try 
     { 
      String vm1Line; 
      while((vm1Line = inInvFile1.readLine()) != null) 
      { 
       // This is what I was using for now to simply print my file 
       System.out.println(vm1Line); 
      } 
     } 
     catch(IOException e) 
     { 
      System.out.println("I/O Error: " + e); 
     } 
    } 
} 

私が見えることはできませんので、これは、私のテキストファイルを作成したコードです代わりにテキストファイルをどのように添付するかを確認してください。 /** * * a PrintWriterストリームを使用して、自動販売機1で見つかった在庫を作成するクラス。 * @ */

私は動的にするこの事のために必要な
import java.io.*; 

public class VMMix1 

{ 
public static void main(String[] args) 
{ 
    String [] product = {"Coke", "Dr. Pepper", "Sprite", "RedBull", 
          "Cool Ranch Doritos", "Lay's Potato Chips", 
          "Pretzels", "Almonds", "Snickers", "Gummi Bears", 
          "Milky Way", "KitKat"}; 
    String [] packaging = {"bottle", "can", "can", "can", "bag", "bag", 
          "bag", "bag", "wrapper", "bag", "wrapper", 
          "wrapper"}; 
    float [] price  = {2.25f, 1.75f, 1.75f, 2.00f, 1.00f, 1.00f, 0.75f, 1.50f, 
          1.25f, 1.00f, 1.25f, 1.25f}; 
    int [] quantity = {10, 10, 10, 12, 8, 10, 12, 9, 7, 11, 10, 8}; 

    try(PrintWriter outFile = new PrintWriter("vmMix1.txt")) 
    { 
     for (int index = 0; index < product.length; index++) 
     { 
      outFile.printf("%-18s %-10s: $%.2f qty: %3d\n", product[index], 
          packaging[index], price[index], quantity[index]); 
     } 
    } 
    catch (IOException except) 
    { 
     System.out.println("IOException: " + except.getMessage()); 
    } 
} 
} 

著者ミシェルメリット 。プログラムが実行されて何かが購入されると、私は在庫を失い、自動販売機の金額を変更する必要があります(貨幣の金額を収容する別のクラスの通貨があります)。私は配列の値を維持し、更新された配列を再印刷する必要があります。どんな助けも大歓迎です。

+1

コレクションを使用できない特別な理由はありますか?またはそれはちょうど「挑戦」です –

+0

@ジェラルド・ムッキーそれはクラスのためであり、私たちはまだそれらを越えていません。割り当てには明示的に使用できないことが明示されています。 –

+0

これまでに提供された回答はStreamsを使用しています。あなたはそれらを使うことが許されていますか?また、配列にデータを読み込むことについての質問だけでしたか、または各行を読むときに在庫を更新するためにそれを使用することについて質問がありましたか? –

答えて

1

あなたは、あなたも事前Java8、最短の方法の、おそらく1がにファイル全体を読むことです

try (Stream<String> stream = Files.lines(Paths.get("vmMix1.txt"))) { 

     String [] array = stream.toArray(String[]::new); 

} 

を使用して、バッファの作成をスキップすることができJava8ストリームAPI

String[] array = reader.lines().toArray(String[]::new); 

を使用することができます文字列に分割して(文字列に読者を読み取る方法はhere)、

String[] array = fileAsString.split('\\n'); 

もちろん、ループ内に配列を作成し、System.arraycopyを使用してすべての行に対して配列を増やすこともできます(この場合はかなり遅くなる可能性があります)。

String[] array = new String[0]; 
while((vm1Line = inInvFile1.readLine()) != null) { 
    String[] newArray = new String[array.length + 1]; 
    System.arraycopy(array, 0, newArray, 0, array.length); 
    newArray[array.length] = vm1Line; 
    array = newArray; 
} 

あなたは、最初の大きなアレイを作成することによってこの方法を最適化するラインを埋める、必要に応じて(のarraycopyを使用して)アレイのサイズを増加させ、最後に書き込まれた行数にアレイを縮小することができます。 配列リストとは多少異なります。したがって、コレクションのAPIを使用する場合は、単に行うことができます

​​
+0

ストリームには、配列コンストラクタ(String [] :: newまたはlength-> new String [length])を受け入れるtoArray()メソッドがあるので、次のことができます。 try(Stream stream = Files.lines ( "vmMix1.txt"))){ String [] array = stream.toArray(String [] :: new); } – srborlongan

+1

はい、そうです、それを指摘してくれてありがとう –

0

希望します。

Stream<String> lines = Files.lines(Paths.get("C:/SelfStudy/Input.txt")); 
String[] array = lines.toArray(String[]::new); 
関連する問題