在java中找到两个多重集的交集

时间:2013-01-30 17:41:43

标签: java

         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)=' ';处出错。我写了那条线,因为当我们找到一个十字路口时,我们不应该再检查那个元素。你能帮忙吗?

2 个答案:

答案 0 :(得分:1)

正如Brian所说,java中的字符串是不可变的。这意味着您无法通过类似m2.charAt(j)=' '的方法调用进行分配。这意味着您必须使用其他方式来跟踪您是否已找到该角色。

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

编辑:

很抱歉没有考虑到输出应该是一个multiset。如果输出是一组,上面解决了问题。

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

    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以考虑空格。如果我们假设两个字符串的格式为'a a a a a a a',而'a'只是一个字符,则。如果有超过一位数字的数字或字符,那么你必须跳过空格并以不同的方式解释字符串,而不是仅仅逐个字符地查看它。

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

答案 1 :(得分:1)

您无法使用

修改字符串的内容
m2.charAt(j)=' ';

改为

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

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