**已关闭。**此问题需要debugging details。当前不接受答案。
编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
昨天关门了。
Improve this question
如果我们有一个字符串列表
ArrayList<String> listA = new ArrayList(Arrays.asList("C", "E", "B", "F", **"E"**, "A", "G", "G", "C", "A", "B", **"G"**));
还有一个清单:
ArrayList<String> listB = new ArrayList<>(Arrays.asList("E", "D", "C", "D", **"E"**, "E", "E", "D", "D", "D", "E", **"G"**));
正如你所看到的,这两个列表在位置4和11上匹配,E和G是两个匹配的字母,即在同一位置上是同一个字母。
我想做的是替换列表B中与列表A中的值不匹配的值,也就是说,不是4上的E和11上的G的所有其他字母都应该是该列表中的新随机字母
ArrayList<String> someListOfValues = new ArrayList(Arrays.asList("C", "C#", "D", "Eb", "E", "F", "F#", "G", "G#", "A", "Bb", "B"));
但是应该保留两个匹配。
我试着创建一个新的列表,它会记住列表不匹配的位置
就像这样
ArrayList<Integer> unmatchingPositions = new ArrayList<>();
ArrayList<Integer> matchingPositions = new ArrayList<>();
for (int j = 0; j < listA.size(); j++) {
if (ListA.get(j).equals(ListB.get(j))) {
matchingPositions.add(j);
} else unmatchingPositions.add(j);
}
然后,我想在listB中找到这些值,并将其替换为随机值
for (int j = 0; j < listA.size(); j++) {
for (int k = 0; k < unmatchingPositions.size(); k++) {
if (k == unmatchingPositions.get(k)) {
listB.set(k, someListOfValues.get(rand.nextInt(someListOfValues.size())));
}
}
}
但这不起作用,我想不出问题出在哪里。
2条答案
按热度按时间dm7nw8vv1#
if (k == unmatchingPositions.get(k)) {
这是说,如果存储在不匹配列表的位置k的值== k,那么替换它。这没有意义。你知道它不匹配,所以只替换它。不需要if
您可以一次完成所有操作:
您需要对此进行一些扩展,以处理列表大小不同的情况
aurhwmvo2#
您不需要两个列表和冗余的嵌套循环,而是识别不匹配的元素的索引并将它们存储到列表中。
然后迭代此索引列表,并使用
List.set()
方法替换listB
中的每个对应元素。