2016-10-10 16 views
0

私はここにいるので少し忍耐を示してください。私は外部ファイルからデータを読み込み、2つの配列に情報を格納しようとしています。外部ファイルから行を読み込んで配列を配列に格納する

0069  723.50 
0085  1500.00 
0091  8237.31 

私が入力を読み取るために2台のスキャナーを使用していると私は私が印刷しようとすると、結果はOKに見えるので、彼らはOK仕事だと思う: ファイルには、次のようになります。 私の最初の問題は、nextInt()を使ってリストの最初の数字を読むことができますが、 "java.util.InputMismatchException"メッセージを受け取るので、二重のものにnextDouble()を使うことができないことです。そのため私はそれを文字列として読みます。他の2つのスキャナの部分は、異なる入力ファイルに対して、最初の部分が行うべきことをするはずですが、問題は同じです。 私の次に大きな問題は、今まで2つの列の値を2つの異なる配列に格納できないことです。私はいくつかの方法(すべてコメント)を試みましたが、すべて失敗します。助けてくれてありがとう。あなたがnextInt()機能を使用してdoubleを読み込むしようとするため

import ui.UserInterfaceFactory; 
import java.io.PrintStream; 
import java.util.Arrays; 
import java.util.Scanner; 
import ui.UIAuxiliaryMethods; 

public class Bank { 
    static final int MAX_NUMBER_OF_ACCOUNTS = 50; 

    PrintStream out; 

    Bank(){ 
     UserInterfaceFactory.enableLowResolution(true); 
     out = new PrintStream(System.out); 
    } 

    void readFiles(){ 
     Scanner balanceFile = UIAuxiliaryMethods.askUserForInput().getScanner(); 
     while(balanceFile.hasNextLine()){ 
      String balance_Line = balanceFile.nextLine(); 
      Scanner accountsFile = new Scanner(balance_Line); 

      int account = accountsFile.nextInt();      //works 
      out.printf("%04d ",account); 


      /*int [] accounts_array = new int [MAX_NUMBER_OF_ACCOUNTS];   //does not store the values properly 
      int account = accountsFile.nextInt(); 
      for(int j=0; j < accounts_array.length; j++){ 

       accounts_array[j] = account; 

      }*/ 

      /*int [] accounts_array = new int [MAX_NUMBER_OF_ACCOUNTS];   //java.util.InputMismatchException 
       for(int j=0; j < accounts_array.length; j++){ 

        accounts_array[j] = accountsFile.nextInt(); 
        //out.printf("%04d \n",accounts_array[j]); 
       }*/ 


      String balance = accountsFile.nextLine();      //problem declaring balance as a double 
      out.printf("%s\n",balance); 

      /*String [] balance_array = new String [MAX_NUMBER_OF_ACCOUNTS];   //java.util.NoSuchElementException 
      for(int j=0; j < balance_array.length; j++){ 
       accountsFile.useDelimiter(" "); 

       balance_array[j] = accountsFile.next(); 
       //out.printf("%04d \n",accounts_array[j]); 
      }*/ 
     } 

     Scanner mutationsFile = UIAuxiliaryMethods.askUserForInput().getScanner(); 
     while(mutationsFile.hasNext()){ 

      String mutation_Line = mutationsFile.nextLine(); 
      Scanner mutatedAccountsFile = new Scanner(mutation_Line); 


      int mutated_account = mutatedAccountsFile.nextInt(); 
      out.printf("%04d ",mutated_account); 


      int action = mutatedAccountsFile.nextInt();  //deposit or withdrawal 
      /*if (action == 1){ 

      }else{ 

      }*/ 
      out.printf(" %d ",action); 

      /*Double amount = mutatedAccountsFile.nextDouble(); 
      out.printf(" %5.2f ",amount);*/ 
      String amount = mutatedAccountsFile.nextLine(); 
      out.printf("%s\n",amount); 
     } 

    } 

    void start(){ 
     new Bank();readFiles(); 
    } 


    public static void main(String[] args) { 
     new Bank().start(); 
    } 
} 
+1

完全なエラーメッセージを投稿してください。 – shmosel

答えて

0

InputMismatchExceptionが発生: はここに私のコードです。この問題を解決するには、最初にnext()関数を使用してトークンを文字列として読み取り、それらを適切に変換することができます。

while(mutationsFile.hasNext()){ 
    mutation_Line = mutationsFile.next(); 
    if(mutation_Line.indexOf(".") == -1) 
     //token is int 
    else 
     //token is double 
} 

あなたはすでに2列の内容が何であるかを知っているので、次の2つのリストの整数とダブルスを保存することができ、その後、あなたがしたい場合は、配列にそれらを取得します。今

List<Integer> intList = new ArrayList<Integer>(); 
List<Double> doubleList = new ArrayList<Double>(); 

置き換えるこれで最初のスニペットでのif文:

Object[] intArr = intList.toArray(), 
     doubleArr = doubleList.toArray(); 
//display the contents: 
for(int i=0; i<intArr.length; i++) 
out.printf("%04d\t%.2f\n", Integer.parseInt(intArr[i].toString()), 
         Double.parseDouble(doubleArr[i].toString())); 

OUTPUT

if(mutation_Line.indexOf(".") == -1) 
    intList.add(new Integer(Integer.parseInt(mutation_Line))); 
else 
    doubleList.add(new Double(Double.parseDouble(mutation_Line))); 

最後に、あなたは配列にそれらを得ることができます

0069 723.50 
0085 1500.00 
0091 8237.31 
0

まず、2台のスキャナを使用する必要はありません。 Scannerオブジェクトは単にファイルを読み込んでいるだけで、1つのスキャナはファイルを読み込む作業を十分に果たしています。

ファイルから整数/倍精度を読み取ろうとしていて、nextInt()およびnextDouble()に問題がある場合は、別の方法で解析することを検討してください(たとえば、行を解析して文字列に変換し、スペース文字に基づいてパーツを作成し、結果の文字列をトリミングしてそれぞれの整数/倍精度に変換します)。

2つの値を解析するスキャナに戻って、まずnext()またはnextInt()などを使用するときは、次のそれぞれのトークンを消費することに注意してください。この場合、ファイルから別のScannerオブジェクトへの文字列としての行の解析は、冗長で不要です。

アカウントの最大数がわかっていて、それが単純に50である場合は、whileループの前に割り当てを行ってください。

あなたが投稿したコードの代わりの方法があります。

public class App { 
    static int MAX_NUMBER_OF_ACCOUNTS = 50; 
    static PrintStream out; 
    static void readFiles() { 
     Scanner balanceFile = null; 
     try { 
      balanceFile = new Scanner(new File("C:\\Users\\Nick\\Desktop\\test.txt")); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
     if (balanceFile == null) 
      return; 
     int [] accounts_array = new int [MAX_NUMBER_OF_ACCOUNTS]; 
     double [] balance_array = new double [MAX_NUMBER_OF_ACCOUNTS]; 
     int currentIndex = 0; 
     while (balanceFile.hasNextLine()) { 
      int account = balanceFile.nextInt(); 
      double balance = balanceFile.nextDouble(); 
      System.out.print("acc = " + account + " "); 
      System.out.println("bal = " + balance); 
      //out.printf("%04d ", account); 
      accounts_array[currentIndex] = account; 
      //out.printf("%s\n", balance); 
      balance_array[currentIndex] = balance; 
      currentIndex++; 
     } 
     balanceFile.close(); 
    } 
    static void start() { 
     readFiles(); 
    } 
    public static void main(String[] args) { 
     start(); 
    } 
} 

静的の過度の使用を注意してくださいまた、将来的に回避することができますが、例のためには、疫病のように広がります。

whileループまでのロジックからわかるように、スキャナオブジェクトは、私のデスクトップ上のファイルにサンプルデータをコピーしたファイルから作成されています。配列はwhileループの前に割り当てられます(注:@progy_rockとArrayListを使用すると、長期的にコードを改善できます)。最後に、行数を挿入する配列内の位置を移動するためにインデックスカウントをメモします。

関連する問題