将并行数组复制到新的并行数组而不重复

时间:2015-09-29 21:26:30

标签: java arrays

我正在编写一个方法,它接受两个并行数组和一个int size变量来跟踪索引。例如,

String[] names = new String[100]; //Partially filled array
int[] scores = new int[names.length]; //Scores for each plater
int entry = 0;

names[size] = "Bob";
scores[size] = 20;
size++;

以上代码表示我第一次进入Bob的“列表”中,得分为20分。

我正在编写一个采用names数组,得分数组和size变量的方法。我必须将传入的数组的信息复制到新数组中,但将重复的条目复制到一个条目中并将它们的总和对齐。

例如,如果有原始列表

Name: Bob, Score: 20
Name: Paul, Score: 30
Name: Bob, Score: 10
//Size - 3

所以我的新并行数组必须是

Name: Bob, Score: 30
Name: Paul, Score 30
//Size - 2

我已经创建了一个方法,并且确实添加了名称的总和,我坚持删除重复项的过程。

public static void totalDurations(String[] oldNames, int[] oldScores, int oldSize) {

    String[] newNames = new String[100];
    int[] newScores = new int[newNames.length];
    int newSize = 0;

    int matchPos;
    int addDuration = 0;

    String tempString = null;

    for (int i = 0; i < oldSize; i++) {

        //the find method returns the index of a string if found else it returns -1
        matchPos = find(oldNames, oldSize, 0, oldNames[i]);

        while (matchPos >= 0) {

            addDuration += oldScores[matchPos];

            // Find the next match, starting after the last one
            matchPos = find(oldNames, oldSize, matchPos + 1, oldNames[i]);

        }



        newNames[newSize] = oldNames[i];
        newScores[newSize] = addDuration;
        addDuration = 0;
        newSize++;

    }

    //Print the List
    for (int i = 0; i < newSize; i++) {
        System.out.println("Name: " + newNames[i] + ",  Score: " + newScores[i] );
    }

}

如果我传递条目

"Bob", 10
"Bob", 10
"Paul", 20
"Paul", 20
"Bob", 10

我的输出是

Name: Bob, Score: 30
Name: Bob, Score: 30
Name: Paul, Score: 40
Name: Paul, Score: 40
Name: Bob, Score: 30

所以我的主要问题。我可以使用什么样的好算法将名称和总分数复制到新阵列一次。同时请记住,由于重复,列表的新大小将始终小于旧大小。

提前谢谢。

我想用只有数组和条件循环来实现这个目的。

3 个答案:

答案 0 :(得分:1)

使用name作为score作为创建地图。如果您发现name已存在,请检索其值,将当前score添加到已检索的score,然后将新score放入地图中进行更新。

在您的初始name[]score[]数组上完成此操作后,迭代地图的EntrySet并将每个姓名和分数添加到相应的新array[]

(顺便说一句,这与并行处理或多线程无关。)

答案 1 :(得分:0)

一种替代方法是每次从输入数组处理新名称,以扫描输出数组以进行匹配。如果找到,则将分数添加到相应的结果分数中;否则,您将名称及其分数附加到结果数组。这对你来说可能就足够了。

但是,如果您希望能够有效地处理长数组,那么您需要某种辅助数据结构来有效地定位已经处理过的名称。这可以是从名称到结果数组索引的映射,也可以是从名称到分数的映射。在前一种情况下,您将按照前面所述进行操作,但请查看Map而不是扫描输出名称数组。在后一种情况下,您将在Map中构建所有的每个名称分数,然后从Map填充结果数组。

答案 2 :(得分:0)

如果您创建了一个新数组,则可以获取第一个数组的每个部分,将其与该数组中的所有元素进行比较,然后将唯一部分放入第二个数组中。也许如果一个元素等于另一个元素,则第一个元素是Null。然后将所有非空元素放入第二个数组并打印。