1

名前と金額のリストを調べようとしています。

1 つの配列にはその人の名前があり、もう 1 つの配列にはその人が与えた金額があります。つまり、john, 55 sally 40 john 33 sarah 55 です。

私の目的は、同類の名前を合計し、その人の名前と与えられた合計金額を出力することです。

John は 2 回与えたので、合計は 88 になるはずです。したがって、john 88 は 2 回出力しています...最初の for ループに入れて、配列全体の長さを繰り返しているため、その可能性が高いことがわかります。

しかし、これを解決する方法がわかりませんか?

import java.util.*;

public class chapterfive {
    public static void main (String[]args) {
       Scanner in = new Scanner (System.in);
       String[]names = new String[4];
       int[] scores = new int[4];
       for (int i = 0; i<names.length; i++) {
           names[i] = in.next();
           scores[i] = in.nextInt();
       }
       int amount = 0;
       String firstname = "";

       for (int i = 0; i < names.length; i++) {
           for (int j=0; j < names.length; j++) {

               if (names[j].equals(names[i]))
                   amount += scores[j];
           }

       System.out.println(names[i] + "  " + amount);
       amount = 0;
       }
    }
}
4

4 に答える 4

1

Name -> Score のような関係があることがわかります。より抽象的に考えると、これは Key (Name) と Value (Score) の辞書であり、 a のような別のデータ構造を使用したり、 aMapを使用したりできます。配列とクラス Person を作成し、arrayOrderer を持ち、新しい人を追加するときに、その人が配列に存在するかどうかを確認します。

例 :

Map <String , Integer> people = new HashMap<>();
     for (int i=0; i<lengthYouWant; i++)
           {
               String name=in.next();
               int score=in.nextInt();

               if(people.contains(name)){
                 score= people.get(name)+score;
               }
                people.put(name,score);
           }
于 2013-06-27T02:42:02.647 に答える
0

Person クラスの配列またはリストを作成すると、 Comparable を実装して、並べ替えに役立つメソッドを追加できます。

于 2013-06-27T02:50:17.090 に答える
0

2 つの配列を追跡するのではなく、Map を使用して単純化する必要があります。しかし、うまくいくかもしれない修正があります(テストしていません)

   String firstname = "";

   for (int i = 0; i < names.length; i++) {
       int amount = 0;
       boolean skip = false;

       for (int j=0; j < names.length; j++) {
          //need to skip because we have already processed it
          if(names[j].equals(names[i]) && i > j) {
              skip = true;
              break;
          } 
          else if (names[j].equals(names[i])) {
               amount += scores[j];
          }
       }
       if(!skip) {
         System.out.println(names[i] + "  " + amount);
       }
   }
于 2013-06-27T04:04:07.233 に答える
0

Java はオブジェクト指向言語です。これは、とりわけ、独自のデータ構造を作成できることを意味します。並列配列を使用するとエラーが発生しやすく、一緒に保持したいデータが分離されます。では、これを整理するには何が必要ですか?

まず、名前と金額を格納する方法です。それを呼び出しますDonation

class Donation {
    private final String name;
    private final int    amount;
    public Donation(String name, String amount) {
        this.name = name;
        this.amount = amount;
        // EXERCISE: Add error checking.
    }
    public String getName()   { return name;   }
    public int    getAmount() { return amount; }
    public String toString() {
        return "Name: " + name +", amount: " + amount;
    }
}

このクラスの変数は final であることに注意してください。一度設定すると変更できません。System.out.printlnそれらはコンストラクターで設定され、get メソッドと、ステートメントにあるものを置き換える toString メソッドがあります。

次に、データを格納する方法が必要です。配列を使用しないでください。 Lists はより柔軟です。

private static List<Donation> donations = new ArrayList<Donation>();

// and in main:

while (true) {
    String name = null;
    int amount = 0;
    if (in.hasNext()) {
        name = in.next();
    } else {
        break;
    }
    if (in.hasNextInt()) {
        amount = in.nextInt();
    } else {
        break;
    }
    donations.add(new Donation(name, amount));
}   See -- no 4s.

次に、繰り返し寄付を統合する必要があります。つまり、毎週日曜日に教会に寄付をする人がいます。適切な構造 a を使用しますMap

// Also in main:
Map<String, Integer> totals = new HashMap<>();
for(Donation d: donations) {
    String name = d.getName();
    int amount = d.getAmount();
    if (!totals.containsKey(name)) {
        totals.put(name, 0);
    }
    int currentDonation = totals.get(name);
    totals.put(name, currentDonation + amount);
}

そして最後に、マップを繰り返し処理し、各エントリを出力します。

for ( Map.Entry<String, Integer> entry: totals.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

そして今、別の演習と戦略: ですべてをやめるmain. クラスChapterFiveのインスタンス変数とメソッドを指定します。次に、これらのテストを作成します。私が提案したことの改善点を見つけてみてください。次に、役立つライブラリがあるかどうかを確認します。

于 2013-06-27T03:06:02.157 に答える