1

基本上,它是一个程序,它正在扫描文件并保持三个独立的运行记录。但是,它错误地添加了它们,我不知道为什么

最后的计数应该是

“教育部获得 1435690 票或 38%
拉里获得 1165029 票或 30%
卷毛获得 1221257 票或 32%”


但是,我的正在阅读

“Moe 获得 1221257 票或 32%
Larry 获得 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

4 回答 4

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

于 2013-10-26T18:12:30.783 回答
1

为什么不使用BufferedReaderJava 中的类?这是代码:

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();
    }
}
于 2013-10-26T16:55:46.980 回答
0

Here is a solution I wrote up for you:

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.");

}

Some things to take note of:

  • You can use Scanner scan = new Scanner(new File("file.txt")).useDelimiter("\\Z"); to read an entire file into one string (as \\Z is the symbol for End Of File (EOF).

  • mprecincts++ is equivalent to mprecincts += 1

  • More information on regular expressions in Java can be found in the Pattern documentation.

The answers from ByteCode and djjolem explain why your values did not print properly, please feel free to comment below and I hope this helps.

于 2013-10-26T18:35:20.297 回答
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;
    }
于 2013-10-26T17:02:41.203 回答