我正在编写一个方法,它接受两个并行数组和一个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
所以我的主要问题。我可以使用什么样的好算法将名称和总分数复制到新阵列一次。同时请记住,由于重复,列表的新大小将始终小于旧大小。
提前谢谢。
我想用只有数组和条件循环来实现这个目的。
答案 0 :(得分:1)
使用name
作为键和score
作为值创建地图。如果您发现name
已存在,请检索其值,将当前score
添加到已检索的score
,然后将新score
放入地图中进行更新。
在您的初始name[]
和score[]
数组上完成此操作后,迭代地图的EntrySet
并将每个姓名和分数添加到相应的新array[]
中
(顺便说一句,这与并行处理或多线程无关。)
答案 1 :(得分:0)
一种替代方法是每次从输入数组处理新名称,以扫描输出数组以进行匹配。如果找到,则将分数添加到相应的结果分数中;否则,您将名称及其分数附加到结果数组。这对你来说可能就足够了。
但是,如果您希望能够有效地处理长数组,那么您需要某种辅助数据结构来有效地定位已经处理过的名称。这可以是从名称到结果数组索引的映射,也可以是从名称到分数的映射。在前一种情况下,您将按照前面所述进行操作,但请查看Map而不是扫描输出名称数组。在后一种情况下,您将在Map中构建所有的每个名称分数,然后从Map填充结果数组。
答案 2 :(得分:0)
如果您创建了一个新数组,则可以获取第一个数组的每个部分,将其与该数组中的所有元素进行比较,然后将唯一部分放入第二个数组中。也许如果一个元素等于另一个元素,则第一个元素是Null。然后将所有非空元素放入第二个数组并打印。