在while循环中扫描文件,添加数字

时间:2013-10-26 16:50:36

标签: java while-loop

基本上,这是一个扫描文件并保持三个独立运行状态的程序。但是,它添加错误,我不知道为什么

最终的结果应该是

“pe”为1435690票或38%票 拉里得到1165029票或30% Curly获得1221257票,32%“


但是,我的正在阅读

“Moe得到1221257票或32% 拉里得到1165029票或30% Curly获得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

4 个答案:

答案 0 :(得分:1)

为什么不在Java中使用BufferedReader类?这是代码:

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

答案 1 :(得分: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()));

你改变了对Curly和Moe的投票。它应该是:

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的投票。

答案 2 :(得分: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;
    }

答案 3 :(得分: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的答案解释了为什么您的价值观无法正确打印,请随时在下方发表评论,我希望这会有所帮助。

相关问题