如何从Java中删除并行数组中的重复项?

时间:2015-09-20 20:53:39

标签: java arrays parallel-processing parallel-arrays

所以,我开始学习Java,并想知道如何从源数组中精确存储一次string和int类型的并行数组。例如,我有两个彼此平行的阵列,一个将电话号码存储为字符串,另一个存储呼叫的持续时间,作为从每个电话号码获得的/一个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

(26s + 28s)

在java中如何确保并行数组中没有存储重复项并获得每个电话号码的总持续时间而不是在数组中单独存储它们?

3 个答案:

答案 0 :(得分:0)

问题是:“在java中如何确保并行数组中没有存储重复项并获得每个电话号码的总持续时间而不是将它们分别放在数组中?”

答案是:没有(廉价)方式。

改为使用哈希映射。看看java.utils.HashMap。哈希映射是用于存储与特定密钥相关联的值(任何类型)的概念。在您的情况下,值将是持续时间,键将是您的电话号码。因此,您应该在此使用String - Integer哈希映射。

在插入时执行以下操作:

  • 对于每个电话号码持续时间对:
    • 指定密钥的HashMap中是否已有一个元素?
    • 否 - >添加电话号码和持续时间
    • 是 - >
      • 获取存储时间
      • 将当前持续时间添加到存储的持续时间
      • 使用新的持续时间计算覆盖现有项目

稍后您可以有效地执行查找。

答案 1 :(得分:0)

  

Map是将键映射到值

的对象

在您的情况下,您希望电话号码(存储在String中)与通话时长(int s)相对应。因此,您要声明HashMap如下(注意您无法实例化Map,它是一个界面):

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

这是一个更好的版本,因为您不再需要跟踪两个不同的阵列。现在,而不是

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

你可以写:

callRecords.put("888-555-0000", 10);

答案 2 :(得分:0)

如前面的答案中所述,您可以使用地图 - 将避免在phoneNumber和callDuration(Java code to Prevent duplicate <Key,Value> pairs in HashMap/HashTable)中重复。

或者,如果你想坚持使用String实现,你可以改变findAllCalls()方法中的逻辑。

return taxsnl(s);