0
         for(i=0;i<m1.length();i++)
             for(j=0;j<m2.length();j++)
                 if(m1.charAt(i)==m2.charAt(j)){
                     intersection=intersection+m1.charAt(i); 
                     m2.charAt(j)=' ';



                 }

                    System.out.println(intersection);



         } while(devam==false);

    }

}

那是我的代码。而且我们不允许使用方法或数组,我们只是初学者。我的代码在 m2.charAt(j)=' ';. 我写那行是因为,当我们找到一个交叉点时,我们不应该再次检查那个元素。你能帮忙吗?

4

2 回答 2

1

正如 Brian 所说,Java 中的字符串是不可变的。这意味着您不能通过像 . 这样的方法调用进行分配m2.charAt(j)=' '。这意味着您必须使用另一种方式来跟踪您是否已经找到该角色。

您可以将它添加到并在检查字符时使用intersection确保它不在,如果返回 -1 则它不在字符串中。intersectionintersection.indexOf(char c)

编辑:

抱歉没有考虑到输出应该是一个多集。如果输出是一个集合,上面解决了这个问题。

你可以replaceFirst(String searchFor, String replacement)在你的 m2 上使用来删除它。它会是这样的:

    for( int i =0; i < m1.length(); i+=2)
    {
       if(m2.indexOf(m1.charAt(i)) != -1)
       {
          intersection = intersection + m1.charAt(1) + " ";
          m2 = m2.replaceFirst(new String(m1.charAt(i)), "");
       }
    }

因此,如果 m1 = '1 1 2 3 5' 且 m2 = '1 4 2 1',

第一遍:在 '1 4 2 1' 中查找 1

第二遍:在 '4 2 1' 中查找 1

第三遍:在 '4 2' 中寻找 2

第四遍:在 '4' 中寻找 3

第五遍:在 '4' 中寻找 5

返回“1 1 2”

请注意,它会将变量增加 2 以考虑空格。仅当我们假设两个字符串的形式为“aaaaaa a”时,“a”只是一个字符。如果有数字或字符长度超过一个数字,那么您必须跳过空格并以不同的方式解释字符串,而不仅仅是逐个字符地查看它。

如果我们可以做出这些假设,那么明智的做法是在执行此循环之前使用 Stringtrim方法修剪 m1 的尾随和前导空格。m1 = m1.trim()

于 2013-01-30T17:58:16.373 回答
1

您不能修改字符串的内容

m2.charAt(j)=' ';

改为这样做

m2 = m2.replace(m2.charAt(j), ' ');

请注意,replace() 将替换字符串中等于第一个参数的第一个字符。我假设,既然字符串代表一个集合,就不会出现重复的字符。如果有并且您想替换所有这些,只需使用 replaceAll() 代替。

于 2013-01-30T18:01:25.887 回答