【问题标题】:Compare two String arrays , return matched Strings and mismatched Strings separately比较两个字符串数组,分别返回匹配的字符串和不匹配的字符串
【发布时间】:2015-12-12 07:39:49
【问题描述】:

我正在开发一个安卓应用程序。我正在尝试比较两个字符串数组并返回匹配项、不匹配项。 我尝试了几个解决方案,但它根本不起作用。我需要分别匹配和不匹配。

这里是带有示例数据的数组

String[] number_one = { "info@fn.ca" , "+122637867"  , "486" , "smbr" , "9946567" };

String[] number_two = { "+122637867" , "486" , "nrkZone"  , "smbr'};

这是我正在处理的示例代码。

          for(int n =0; n < number_one.length; n++){

            if(number_one[n] == number_two[n]){
                 Log.d("Cursor" ,number_one[n]);
            }else{
                 Log.d("Cursor" ,number_two[n]);
             }

           }

我想要像(示例数据)这样的输出

 Matched : +122637867 , 486 , smbr
 Mismatched :  info@fn.ca , nrkZone , 9946567

【问题讨论】:

  • 你到底想要什么结果?
  • 使用 "equals" 来比较字符串值。另外,正如您的代码一样,如果令牌在数组中具有相同的位置,您只会匹配令牌。这是您想要的吗?
  • 不,我也想从两个数组中找到匹配的字符串和不匹配的字符串.. @HojjatImani
  • 不,他想要一个带有 +122637867, 486,smr 和另一个 info@fn.ca, ETC 的字符串。
  • @dacrovinunghi 是的,伙计 :) 你明白了 :)

标签: java android arrays


【解决方案1】:

我可能做得比我应该做的多,甚至可能把事情弄得太复杂了。但我会让你们决定。

我做的第一件事是使用 HashSets 来存储匹配和不匹配的值。这很有用,因为它们只存储每个值中的一个。

String[] number_one = { "info@fn.ca" , "+122637867"  , "486" , "smbr" , "9946567" };
String[] number_two = { "+122637867" , "486" , "nrkZone"  , "smbr"};


HashSet<String> matched = new HashSet<String>();
HashSet<String> mismatched = new HashSet<String>();

现在我有很多 for 循环,我认为这部分可以简化为一个。但很可惜,它有效。现在至于为什么。好吧,这段代码的工作方式是假设数组中的所有值都没有匹配项,除非另有证明。所以它只是将它们全部放入mismatched HashSet。

for (int i = 0; i < number_one.length; i++) {
    mismatched.add(number_one[i]);
}

for (int i = 0; i < number_two.length; i++) {
    mismatched.add(number_two[i]);
}

现在您需要嵌套两个 for 循环来遍历两个数组,并在此过程中检查任何匹配项,如果有匹配项,则将其添加到 matched HashSet。

for(int n = 0; n < number_one.length; n++) {
       for (int m = 0; m < number_two.length; m++) {
           if(number_one[n].equals(number_two[m])){
            matched.add(number_one[n]);
           }
       }
   }

现在我们只需从mismatched 变量中删除所有我们知道匹配的值,该变量已经具有所有可能的值。我们只是删除了我们知道匹配的内容。

for (int i = 0; i < matched.size(); i++) {
    mismatched.remove(matched.toArray()[i]);
}

在这里,我们只是以一种半整齐的方式将它们打印出来。

System.out.print("Matched: ");
for (int i = 0; i < matched.size(); i++) {
    System.out.print(matched.toArray()[i] + " ");
}

System.out.println("");
System.out.print("Mismatched: ");
for (int i = 0; i < mismatched.size(); i++) {
    System.out.print(mismatched.toArray()[i] + " ");
}

【讨论】:

  • 这个只打印很少的匹配项。
  • @SijoJohn 你是什么意思?这对我来说可以。要么你用错了,要么我不明白你在做什么。
  • 我的安卓应用中有两个数组。有时一个数组会比第二个数组大。所以循环退出并打印前几个匹配的元素,其余的将与不匹配的一起打印。 @zachery
  • 这就是我的代码所做的,它认为一切都是不匹配的,直到检查匹配的代码运行然后删除它们。我鼓励你复制我所有的代码并在 android 之外运行它。在 vanilla eclipse 或您使用的任何 IDE 中(如果有)。并在顶部摆弄两个阵列。 @SijoJohn
  • 但是为什么android会返回前几个匹配的元素呢?
【解决方案2】:

试试这个使用数组实现的代码。

    String[] number_one = { "info@fn.ca" , "+122637867"  , "486" , "smbr" , "9946567" };
    String[] number_two = { "+122637867" , "486" , "nrkZone"  , "smbr"};
    boolean mismatch=true;
    for(int i=0;i<number_one.length;i++){
        mismatch=true;
        for(int j=0;j<number_two.length;j++){
        if(number_one[i].equals(number_two[j])){
            System.out.println(number_one[i]+"Matches");
        mismatch=false;
        break;
        }
        }
    if(mismatch){
        System.out.println(number_one[i]+"Mis Matches");
    }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2013-05-23
    • 2012-10-12
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多