1

そこで、Java の学習を開始し、string 型と int 型の並列配列をソース配列から 1 回だけ格納する方法を考えていました。たとえば、互いに並列な 2 つの配列があり、1 つは電話番号を文字列として保存し、もう 1 つは通話時間を各電話番号から取得した int として保存します。

String[] phoneNumbers;           
    phoneNumbers = new String[100];
    int[] callDurations = new int[phoneNumbers.length];
    int size = 0;

    phoneNumbers[0] = "888-555-0000";
    callDurations[0] = 10;
    phoneNumbers[1] = "888-555-1234";
    callDurations[1] = 26;
    phoneNumbers[2] = "888-555-0000";
    callDurations[2] = 90;
    phoneNumbers[3] = "888-678-8766";
    callDurations[3] = 28;

    size = 4;

特定の電話「888-555-1234」の通話時間など、特定の電話番号の詳細を見つけるメソッドを作成しました。メソッドと呼び出し方法は次のとおりです。

public static void findAllCalls(String[] phoneNumbers, int[] callDurations, int size, String targetNumber) {
    int match;
    System.out.println("Calls from " + targetNumber + ":");
    match = find(phoneNumbers, size, 0, targetNumber);

    while (match >= 0) {
        System.out.println(phoneNumbers[match] + " duration: " + callDurations[match] + "s");

        match = find(phoneNumbers, size, match + 1, targetNumber);

    }
}

System.out.println("\n\nAll calls from number: ");
    findAllCalls(phoneNumbers, callDurations, size, "888-555-1234");

このコードの出力は次のとおりです。

All calls from number: 
Calls from 888-555-1234:
888-555-1234 duration: 26s
888-555-1234 duration: 28s

Process finished with exit code 0

一方、代わりに取得したい出力は次のとおりです。

All calls from number: 
Calls from 888-555-1234:
888-555-1234 duration: 54s


Process finished with exit code 0

(26 秒 + 28 秒)

並列配列に重複が保存されていないことを確認し、配列に別々に持つのではなく、各電話番号の合計時間を取得するにはどうすればよいですか?

4

3 に答える 3

0

質問は次のとおりです。「並列配列に重複が保存されていないことを確認し、配列に別々に持つのではなく、各電話番号の合計時間を取得するにはどうすればよいですか?」

答えは: (安価な) 方法はありません。

代わりにハッシュ マップを使用してください。をご覧くださいjava.utils.HashMap。ハッシュ マップは、特定のキーに関連付けられた (あらゆる種類の) 値を格納するための概念です。あなたの場合、値は期間になり、キーは電話番号になります。したがって、ここではString-Integerハッシュ マップを使用する必要があります。

挿入時に次の操作を行います。

  • 電話番号と期間のペアごとに、次を実行します。
    • 指定したキーの HashMap に要素が既に存在するか?
    • いいえ -> 電話番号と期間を追加
    • はい ->
      • 保存されている期間を取得する
      • 現在のデュレーションを保存されたデュレーションに追加します
      • 計算された新しい期間で既存のアイテムを上書きします

後で効率的にルックアップを実行できます。

于 2015-09-20T21:01:05.303 に答える
0

Map は、キーを値にマップするオブジェクトです

あなたの場合、電話番号( a に保存されているString)を通話時間(ints )に対応させたいと考えています。したがって、次のように宣言しますHashMap(インスタンス化できないことに注意Mapしてください。これはインターフェイスです)。

Map<String, Integer> callRecords = new HashMap<String, Integer>();

2 つの異なる配列を追跡する必要がなくなるため、これはより優れたバージョンです。今、代わりに

phoneNumbers[0] = "888-555-0000";
callDurations[0] = 10;

あなたは書ける:

callRecords.put("888-555-0000", 10);
于 2015-09-20T21:01:19.510 に答える
0

前の回答で既に述べたように、マップを使用できます- phoneNumber と callDuration の両方で重複を回避します ( HashMap/HashTable で <Key,Value> ペアの重複を防ぐための Java コード)。

または、String の実装に固執する場合は、findAllCalls() メソッドのロジックを変更できます。

public static void findAllCalls(String[] phoneNumbers, int[] callDurations, int size, String targetNumber) 
{
   int match;
   System.out.println("Calls from " + targetNumber + ":");
   //match = find(phoneNumbers, size, 0, targetNumber);
   int i = 0, duration = 0;
   while (i<size)
    {
        if(phoneNumbers[i].equals(targetNumber))
            duration+=callDurations[i];
        i++;
      //System.out.println(phoneNumbers[match] + " duration: " + callDurations[match] + "s");
      //match = find(phoneNumbers, size, match + 1, targetNumber);
   }
   System.out.println(targetNumber+" duration : "+duration+"s");
}
于 2015-09-20T21:12:35.273 に答える