2014-06-23 56 views
1

我想要創建一個程序,它具有一個讀取輸入文件的主類,並調用其他類來存儲雙精度文件包含的數據。另一個類是我調用把兩個數組放在一起,但我沒有成功。任何幫助將不勝感激。 這是主類:從另一個文件中讀取數組的同時創建雙精度數組

package Assignments; 

import java.util.Scanner; 

import ui.UIAuxiliaryMethods; 

public class Processing { 

Processing(){ 
    UIAuxiliaryMethods.askUserForInput(); 
} 

private void start() { 
    Scanner in=new Scanner(System.in); 
    int numberOfClusters=in.nextInt(); 
    int numberOfElements=in.nextInt(); 
    int numberOfVariables=in.nextInt(); 

    String line=in.nextLine(); 
    String lineToIgnore=in.nextLine(); 
    NumberRow i=new NumberRow(numberOfElements); 

    while(in.hasNext()){ 
     String lineToFindDouble=in.next(); 
     NumberRow.start(lineToFindDouble); 
    } 
    System.out.println("\nend"); 


} 

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

} 

和我打電話來存儲雙打類: 包分配;

import java.util.Arrays; 
import java.util.Scanner; 

import ui.UIAuxiliaryMethods; 

public class NumberRow { 
static int i; 
static double[] fatContent; 
static double[] protienContent; 

NumberRow(int numberOfElements){ 
    this.i=numberOfElements; 
    fatContent=new double[i]; 
    protienContent=new double[i]; 
} 

static void start(String in){ 

    Scanner findingDoubles=new Scanner(in); 

    int counter=0; 
    while(findingDoubles.hasNext()){ 
    double fat=findingDoubles.nextDouble(); 
    double protien=findingDoubles.nextDouble(); 
    fatContent[counter]=fat; 
    protienContent[counter]=protien; 
    counter++; 
    } 
    System.out.println(Arrays.toString(fatContent)); 
} 
} 

我使用的輸入文件是:

7 
25 
2 
Mammal fat_content(%) protein_content(%) 
Bison 7.9 5.9 
Guinea_pig 3.9 8.1 
Dolphin 14.0 10.4 
Donkey 1.4 1.7 
Goat 4.1 3.4 
Deer 19.7 9.2 
Dog 8.3 9.5 
Yak 6.7 5.3 
Camel 3.4 3.5 
Cat 10.9 11.1 
Rabbit 13.1 7.1 
Llama 3.2 3.9 
Human 43.9 7.4 
Mule 1.8 2.0 
Elephant 5.0 4.0 
Horse 1.3 2.1 
Rat 12.6 12.3 
Reindeer 20.3 10.4 
Sheep 6.4 5.6 
Pig 5.1 6.6 
Fox 5.9 7.4 
Whale 42.3 10.9 
Polar_bear 31.0 10.2 
Zebra 4.8 3.0 
Seal 53.2 11.2 

我得到的錯誤是:

Exception in thread "main" java.util.InputMismatchException 
at java.util.Scanner.throwFor(Scanner.java:840) 
at java.util.Scanner.next(Scanner.java:1461) 
at java.util.Scanner.nextDouble(Scanner.java:2387) 
at Assignments.NumberRow.start(NumberRow.java:25) 
at Assignments.Processing.start(Processing.java:25) 
at Assignments.Processing.main(Processing.java:33) 

任何幫助將高度讚賞。 PS:我是初學者,所以如果我的代碼看起來很愚蠢,我很抱歉。

謝謝。

+0

如果在下面的所有答案後你無法自己弄清楚。如果需要的話,我準備幫助我甚至可以幫助你逐行寫代碼:)。 – Roan

+1

@羅安非常感謝你的這麼好....我已經想通了,但我非常感謝你的報價,以幫助.....謝謝:) – BlackSwan

+0

沒問題,也看到你想通了,祝你好運其餘的你的代碼:) – Roan

回答

0

的第一個錯誤

while(in.hasNext()){ 
    String lineToFindDouble=in.next(); 
    NumberRow.start(lineToFindDouble); 
} 

你會得到Bison當你在這個位置上進行next()。 你應該改變這種代碼

while(in.hasNextLine()){ 
     String lineToFindDouble=in.nextLine(); 
     NumberRow.start(lineToFindDouble); 
    } 

所以你會被傳遞給NumberRow.start("Bison 7.9 5.9")

下一頁

在你numberRow

while(findingDoubles.hasNext()) 

此時掃描儀光標指向Bison。 你應該改變以

while(findingDoubles.hasNextDouble()) 

使掃描儀將繼續尋找雙,等待在下一個雙第一。

當你調用下一個()掃描程序停止,如果它的查找空間/雙/ int或更多檢查文檔的更多信息。

+0

非常感謝...現在它更有意義... – BlackSwan

0

start方法中,您應該使用hasNextDouble而不是在其環路條件下使用hasNext

您需要檢查每行是否還有2個以上的雙打。喜歡的東西:

static int i; 
static double[] fatContent; 
static double[] protienContent; 
static int counter; 

NumberRow(int numberOfElements){ 
    this.i=numberOfElements; 
    fatContent=new double[i]; 
    protienContent=new double[i]; 
    counter = 0; 
} 

static void start(String in){ 

    Scanner findingDoubles=new Scanner(in); 

    while(findingDoubles.hasNext()){ 
     String name = findingDoubles.next(); 
     if(!findingDoubles.hasNextDouble()) continue; 
     double fat=findingDoubles.nextDouble(); 
     if(!findingDoubles.hasNextDouble()) continue; 
     double protien=findingDoubles.nextDouble(); 
     fatContent[counter]=fat; 
     protienContent[counter]=protien; 
     counter++; 
    } 
    System.out.println(Arrays.toString(fatContent)); 

此外,由於它在亞當·約斯特的答案被曝光,counter不應該在start方法復位。

+0

@Pablo ...感謝你的幫助一百萬....我真的很感激它...再次感謝。 – BlackSwan

0

我可以馬上看到三個問題。

您正在跳過野牛行。你調用in.nextLine,然後linetoignore是另一個in.nextLine。

您正在調用.nextDouble,並且它想要返回一個字符串。 在你的start方法NumberRow你佔線,並調用nextDouble。但事實上,你知道第一項是一個字符串。您可以通過在啓動方法開始時簡單地調用in.next來修復它,以放棄該字符串。

最後,您每次調用start時都將計數器重置爲0,所以它每次都會覆蓋。在你的構造函數中設置計數器,然後在開始時引用它。

+0

感謝您的幫助...我已經解決了它現在在你們所有人的幫助下...... – BlackSwan

0

Scanner.nextDouble()讀取並解釋下一個值爲double。您正在閱讀的字符串,並試圖將其轉化爲雙打

+0

感謝@Kevin的幫助....我現在已經解決了它... – BlackSwan

相關問題