【问题标题】:to find the intersection of two multisets in java在java中找到两个多重集的交集
【发布时间】:2013-01-14 15:23:45
【问题描述】:
         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)=' '; 处出错。我写那行是因为,当我们找到一个交叉点时,我们不应该再次检查那个元素。你能帮忙吗?

【问题讨论】:

  • 它抛出的错误是什么?你可以添加那个堆栈跟踪吗?还要添加您的输入和预期输出。
  • 您不能操纵String 对象,它们是不可变的。提示:尝试使用在for 循环之外声明的变量来跟踪位置,而不是将其设置为空格字符。
  • 如果我们的第一个多重集是 1 1 2 1 1 3 1 4 而第二个多重集是 1 3 5 2 1 我们的交集应该是 1 1 3 2。例如。
  • String.charAt(int i) 返回存在于Stringindex i 处的字符。它不用于在String 的索引i 处分配新值。
  • 我忘记了。好吧,我怎样才能将 m2 字符串中的那个字符更改为 ' ' ?

标签: java


【解决方案1】:

你不能修改字符串的内容

m2.charAt(j)=' ';

改为这样做

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

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

【讨论】:

  • @VishalK 是的。修正了我的答案
  • 问题清楚地表明“多组”,重复是可以预料和考虑的。
【解决方案2】:

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

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

编辑:

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

您可以在 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'只是一个字符。如果有数字或字符长度超过一个数字,那么您必须跳过空格并以不同的方式解释字符串,而不仅仅是逐个字符地查看它。

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

【讨论】:

  • 但是我们想要包含重复,当我们发现一个已经出现但应该再次考虑的字符时会发生什么?
  • 是的,实际上这是我的问题。但是,我要尝试以下方法,我认为尤其是 m2=m2.substirng 会起作用。
  • @jacksparrow 我认为您将需要一个更多的字符串操作循环来从最终的intersection String 中删除重复项。可能是冒泡排序或其他排序算法。
  • @raufio 是的,我想到了替换方法,但不幸的是,我们不允许使用这样的方法。再次感谢。
  • @jacksparrow 如果您不想使用 API 方法,那么您可以创建自己的逻辑来替换字符串中的字符。这将导致 lil 额外的工作,但可能
猜你喜欢
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
相关资源
最近更新 更多