2013-10-26 67 views
0

基本上,這是一個掃描文件並保存三個獨立運行記錄的程序。但是,它錯誤地將他們和我不知道爲什麼在while循環中掃描文件,添加數字

最後的帳簿應該讀

「萌爲1435690票或38%
拉里得到了1165029票或30%
捲毛了1221257票礦石32% 「


但由於礦區閱讀

」 萌得到了1221257票或32%
拉里得到了1165029票或30%
捲毛得到了38票或38%」

下面是我的代碼:

import java.io.File; 
import java.util.Scanner; 

/** 
* VoteCounter.java 
* 
* This file contains a program that tallies the results of an election. It 
* reads in the number of votes for each of three candidates in each of several 
* precincts, across several ridings. It determines the total number of votes 
* received by each candidate, the percent of votes received by each candidate, 
* and the number of precincts each candidate carried. 
* 
* ACIT1515, Fall 2013, Lab 7 
*/ 
public class VoteCounter { 

    public static final String DATA_FILE_NAME = "data/election_data.txt"; 

    public static void main(String[] args) throws Exception { 

     int votesForCurly; // number of votes for Curly Fine in a given precinct 
     int votesForLarry;  // number of votes for Larry Howard in a given precinct 
     int votesForMoe;  // number of votes for Moe Howard in a given precinct 

     int totalCurly = 0;  // running total of votes for Curly Fine 
     int totalLarry = 0;   // running total of votes for Larry Howard 
     int totalMoe = 0;  // running total of votes for Moe Howard 

     int totalVotes; 

     int percentCurly; 
     int percentLarry; 
     int percentMoe; 

     int precinctsCurly = 0; 
     int precinctsLarry = 0; 
     int precinctsMoe = 0; 


     // Report header 
     System.out.println(); 
     System.out.println("Election Day Vote Counting Program"); 
     System.out.println(); 


     // Initializations 
     Scanner fileInput = new Scanner(new File(DATA_FILE_NAME)); 
     String line = fileInput.nextLine(); 


     // Outer loop to process the input file 
     while (!line.isEmpty()) { 
      // Inner loop to "process" the votes in each precinct 
      if (Character.isDigit(line.charAt(0))) { 
       votesForCurly = Integer.parseInt(line.substring(0, line.indexOf(","))); 
       votesForLarry = Integer.parseInt(line.substring(line.indexOf(",") + 1, line.lastIndexOf(","))); 
       votesForMoe = Integer.parseInt(line.substring(line.lastIndexOf(",") + 1, line.length())); 

       totalCurly = totalCurly + votesForCurly; 
       totalLarry = totalLarry + votesForLarry; 
       totalMoe = totalMoe + votesForMoe; 

       if (votesForCurly > votesForLarry && votesForCurly > votesForMoe) { 
        precinctsCurly += 1; 
       } 
       if (votesForLarry > votesForCurly && votesForLarry > votesForMoe) { 
        precinctsLarry += 1; 
       } 
       if (votesForMoe > votesForCurly && votesForMoe > votesForLarry) { 
        precinctsMoe += 1; 
       } 
      } 

      line = fileInput.nextLine(); 
     } 


     // Calculate percentages 
     totalVotes = totalCurly + totalLarry + totalMoe; 

     percentCurly = (int) Math.round(totalCurly * 100.0/totalVotes); 
     percentLarry = (int) Math.round(totalLarry * 100.0/totalVotes); 
     percentMoe = (int) Math.round(totalMoe * 100.0/totalVotes); 



     // Print out the results 
     System.out.println("Moe got " + totalMoe + " votes or " + percentMoe + "%"); 
     System.out.println("Larry got " + totalLarry + " votes or " + percentLarry + "%"); 
     System.out.println("Curly got " + percentCurly + " votes or " + percentCurly + "%"); 
     System.out.println(); 
     System.out.println("Moe won " + precinctsMoe + " precincts."); 
     System.out.println("Larry won " + precinctsLarry + " precincts."); 
     System.out.println("Curly won " + precinctsCurly + " precincts."); 
    } 
} 

,這裏是它的掃描文件:

Vancouver Centre 
1774,2986,8071 
22796,13594,3263 
11120,5416,2967 
16163,12886,10131 
20055,10154,215 
28,14300,7756 
4455,11814,22940 
19555,16791,8857 
16049,5984,22481 
17916,16320,4902 
15092,19313,18669 
16711,7374,18005 
24888,18901,17269 
20378,12534,16754 
20517,17697,5369 
3404,2912,23767 
17522,3125,5577 
17060,16596,15937 
15380,18457,22893 
16184,7363,3633 
21988,17397,4856 
2409,21313,6934 
11145,13871,15958 
2209,14052,9593 
16885,7962,13589 
21389,20070,24311 
18516,7125,11187 
5239,3224,5414 
15039,1269,17716 
15402,12378,6480 
24335,12703,2708 
Vancouver East 
23659,23365,10293 
17821,24349,20832 
19548,2153,16097 
12184,13759,20505 
1837,8581,13761 
8089,8357,19641 
19784,9803,15678 
13406,681,18258 
19302,21929,14173 
12220,18225,18049 
16089,6742,19541 
12772,2590,4885 
21848,2005,20611 
24201,13923,18537 
237,18402,5651 
20491,10965,6501 
10614,2644,20582 
22262,11262,7629 
19255,4336,8479 
9813,7134,8015 
3953,3095,3308 
20983,22743,3432 
8173,11534,1458 
6911,17830,11085 
24455,3482,15988 
14393,21393,20689 
13153,9506,15131 
7289,10560,7656 
956,7922,17866 
21389,23199,22537 
20099,10575,19097 
6327,13148,22547 
4202,1004,21440 
15328,13374,7251 
22435,724,8256 
13365,5533,4558 
18515,11222,1177 
22542,9409,5943 
23398,14785,9256 
5979,3119,19390 
17922,17833,2085 
3106,4895,7143 
Vancouver Kingsway 
9747,4517,18064 
336,12944,12723 
11778,13583,15741 
11992,15283,8262 
24253,10345,149 
9661,23799,7546 
17744,13121,13241 
20467,15387,14358 
23836,21289,2249 
13173,12463,6522 
23605,2265,6553 
2296,14530,15371 
15571,23906,16632 
21457,11396,20072 
3917,14163,17443 
19884,1374,8238 
8870,12898,17383 
17176,13704,5364 
23535,23764,17248 
8036,2957,17779 
9601,23551,732 
12535,3636,13827 
22522,14512,13276 
15473,14968,7772 
19428,8653,23980 
2397,13394,7389 
14492,8656,20130 
+2

請看看這個鏈接:http://meta.stackexchange.com/questions/22754/sscce-how-to-provide-examples-for-programming-questions – Tyler

+0

非常感謝你,泰勒!你的幫助非常大 – user2923395

回答

1

爲什麼你不使用BufferedReader Java中的類?以下是代碼:

BufferedReader reader = null; 

try { 
    File file = new File("sample-file.dat"); 
    reader = new BufferedReader(new FileReader(file)); 

    String line; 
    while ((line = reader.readLine()) != null) { 
     System.out.println(line); 
    } 

} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    try { 
     reader.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
0

您有邏輯問題,您錯過了=。當這些值相等時,則不會添加任何內容。

你需要下面的代碼

if (votesForCurly > votesForLarry && votesForCurly > votesForMoe) { 
    precinctsCurly += 1; 
} 
if (votesForLarry > votesForCurly && votesForLarry > votesForMoe) { 
    precinctsLarry += 1; 
} 
if (votesForMoe > votesForCurly && votesForMoe > votesForLarry) { 
    precinctsMoe += 1; 
} 

改變

if ((votesForCurly >= votesForLarry) && (votesForCurly >= votesForMoe)) { 
     precinctsCurly += 1; 
    }else if (votesForLarry >= votesForMoe) { 
     precinctsLarry += 1; 
    }else 
     precinctsMoe += 1; 
    } 
+0

當我用你的建議取而代之時,//出現多個錯誤//計算百分比並打印出結果 – user2923395

1

我想你已經在這裏犯的錯誤:

if (Character.isDigit(line.charAt(0))) { 
    votesForCurly = Integer.parseInt(line.substring(0, line.indexOf(","))); 
    votesForLarry = Integer.parseInt(line.substring(line.indexOf(",") + 1, line.lastIndexOf(","))); 
    votesForMoe = Integer.parseInt(line.substring(line.lastIndexOf(",") + 1, line.length())); 

您切換票捲毛和萌。它應該是:

if (Character.isDigit(line.charAt(0))) { 
    votesForMoe = Integer.parseInt(line.substring(0, line.indexOf(","))); 
    votesForLarry = Integer.parseInt(line.substring(line.indexOf(",") + 1, line.lastIndexOf(","))); 
    votesForCurly = Integer.parseInt(line.substring(line.lastIndexOf(",") + 1, line.length())); 

再次閱讀您的任務,並檢查哪些列是Moe,Larry和Curly的投票。

0

這裏是一個解決方案,我寫了你:

public void votes() throws FileNotFoundException { 

    int curly = 0, larry = 0, moe = 0; 
    int cprecincts = 0, lprecincts = 0, mprecincts = 0; 

    Scanner scan = new Scanner(new File("file.txt")).useDelimiter("\\Z"); 
    String contents = scan.next(); 

    Pattern p = Pattern.compile("(\\d*),(\\d*),(\\d*)"); 
    Matcher m = p.matcher(contents); 

    while (m.find()) { 

     int moeVotes = Integer.parseInt(m.group(1)); 
     int larryVotes = Integer.parseInt(m.group(2)); 
     int curlyVotes = Integer.parseInt(m.group(3)); 

     curly += curlyVotes; 
     larry += larryVotes; 
     moe += moeVotes; 

     if ((curlyVotes >= larryVotes) && (curlyVotes >= moeVotes)) { 
      cprecincts += 1; 
     } else if (larryVotes >= moeVotes) { 
      lprecincts++; 
     }else 
      mprecincts++; 
    } 

    int total = curly + larry + moe; 

    System.out.println("Moe got " + moe + " votes or " + (int) Math.round(moe * 100.0/total) + "%"); 
    System.out.println("Larry got " + larry + " votes or " + (int) Math.round(larry * 100.0/total) + "%"); 
    System.out.println("Curly got " + curly + " votes or " + (int) Math.round(curly * 100.0/total) + "%\n"); 

    System.out.println("Moe won " + mprecincts + " precincts."); 
    System.out.println("Larry won " + lprecincts + " precincts."); 
    System.out.println("Curly won " + cprecincts + " precincts."); 

} 

有些事情要注意的:

  • 您可以使用Scanner scan = new Scanner(new File("file.txt")).useDelimiter("\\Z");到整個文件讀入一個字符串(如\\Z是文件結尾符號(EOF)

  • mprecincts++相當於mprecincts += 1

  • 有關Java中正則表達式的更多信息,請參見Pattern文檔。

ByteCodedjjolem的答案解釋爲什麼你的價值觀不正確打印,請隨時在下面評論,我希望這會有所幫助。