比较两个字符串列表并替换不匹配的值[Java] [closed]

e3bfsja2  于 2022-11-20  发布在  Java
关注(0)|答案(2)|浏览(138)

**已关闭。**此问题需要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())));
        }

    }

}

但这不起作用,我想不出问题出在哪里。

dm7nw8vv

dm7nw8vv1#

if (k == unmatchingPositions.get(k)) {这是说,如果存储在不匹配列表的位置k的值== k,那么替换它。这没有意义。你知道它不匹配,所以只替换它。不需要if
您可以一次完成所有操作:

int listASz = listA.size();
for(int i = 0; i < listASz; i++)
{
    if (listA[i] != listB[i])
    {
        listB[i] = /*something*/

您需要对此进行一些扩展,以处理列表大小不同的情况

aurhwmvo

aurhwmvo2#

您不需要两个列表和冗余的嵌套循环,而是识别不匹配的元素的索引并将它们存储到列表中。
然后迭代此索引列表,并使用List.set()方法替换listB中的每个对应元素。

List<String> listA = // initializing the list
List<String> listB = // initializing the list
        
List<Integer> notMatchingPositions = new ArrayList<>();
        
for (int i = 0; i < listA.size() && i < listB.size(); i++) {
    if (!listA.get(i).equals(listB.get(i))) notMatchingPositions.add(i);
}
        
for (int i : notMatchingPositions) {
    String newValue = someListOfValues.get(rand.nextInt(someListOfValues.size()));
    listB.set(i, newValue);
}

相关问题