【问题标题】:Comparing Strings and Returning Boolean比较字符串并返回布尔值
【发布时间】:2013-05-31 12:23:35
【问题描述】:

我目前正在处理一个用例,其中给您 6 个字符串,其中包含 3 个 oldValues 和 3 个 newValues,如下所示:

String oldFirstName = "Yogend"
String oldLastName = "Jos"
String oldUserName = "YNJos"
String newFirstName = "Yogendra"
String newLastName ="Joshi"
String newUserName = "YNJoshi"

现在我基本上想要做的是将每个 oldValue 与其对应的新值进行比较,如果它们不相等则返回 true,即

if(!oldFirstName.equalsIgnoreCase(newFirstName)) {
  return true;
}

现在,由于我有 3 个字段,而且很可能将来我们可能会有更多具有旧值和新值的字符串,我正在寻找一种最佳解决方案,无论有多少新旧值,它都可以在所有情况下工作添加值并且没有大量的 if else 子句。

我认为的一种可能性是将旧值设置为 OldArrayList 并将新值设置为 newArraylist 然后使用 removeAll 删除重复值但不起作用一些情况。

堆栈上的任何人都可以帮助我提供一些关于如何以最佳方式完成此任务的指示。

谢谢, 约根德拉·N·乔希

【问题讨论】:

  • 将每个 OldValues 和 NewValues 存储在一个 ArrayList 中,这样您就可以保持它们之间的某种关系。然后你只需像现在所做的那样比较两个 arrayList 的索引。因此,您将有一个 if-else,但只需遍历 arrayList。
  • 第一件事:return !oldFirstName.equalsIgnoreCase(newFirstName) 就足够了。
  • @benzonico --"...没有大量 if else 子句..."

标签: java string compare scalability equality


【解决方案1】:

您可以使用 lambdaj (download here,website) 和 hamcrest (download here,website),这些库对于管理集合非常强大,以下代码非常简单且运行良好:

import static ch.lambdaj.Lambda.filter;
import static ch.lambdaj.Lambda.having;
import static ch.lambdaj.Lambda.on;
import static org.hamcrest.Matchers.isIn;
import java.util.Arrays;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<String> oldNames =  Arrays.asList("nameA","nameE","nameC","namec","NameC");
        List<String> newNames = Arrays.asList("nameB","nameD","nameC","nameE");

        List<String> newList = filter(having(on(String.class), isIn(oldNames)),newNames);
        System.out.print(newList);  
        //print nameC, nameE
    }
}

使用此库,您可以在一行中解决您的问题。您必须添加到您的项目中:hamcrest-all-1.3.jar 和 lambdaj-2.4.jar 希望此帮助服务。

注意:这将帮助您假设您可以有替代代码。

【讨论】:

  • 这将使团队习惯于 LambdaJ 在新版本 Java 中出现的强大功能。谢谢!
【解决方案2】:

您可以使用两个HashMap&lt;yourFieldName, yourFieldValue&gt; 而不是两个Arrays / Lists / Sets 的Strings(或多个随机字符串);

那么你需要一个方法来通过它们的键来比较两个映射的每个值;

结果将是一个HashMap&lt;String,Boolean&gt;,其中包含每个字段键的名称,如果两个映射中的值相等,则为 true,如果不同,则为 false。

无论以后添加多少字段,方法不变,结果不变。

运行示例:https://ideone.com/dIaYsK

代码

private static Map<String,Boolean> scanForDifferences(Map<String,Object> mapOne, 
                                                      Map<String,Object> mapTwo){

    Map<String,Boolean> retMap = new HashMap<String,Boolean>(); 
    Iterator<Map.Entry<String, Object>> it = mapOne.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry<String,Object> entry = (Map.Entry<String,Object>)it.next();
        if (mapTwo.get(entry.getKey()).equals(entry.getValue()))
            retMap.put(entry.getKey(), new Boolean(Boolean.TRUE));
        else 
            retMap.put(entry.getKey(), new Boolean(Boolean.FALSE));
        it.remove(); // prevent ConcurrentModificationException
    }
    return retMap;
}

测试用例输入

Map<String,Object> oldMap = new HashMap<String,Object>();
Map<String,Object> newMap = new HashMap<String,Object>();

oldMap.put("initials","Y. J.");
oldMap.put("firstName","Yogend");
oldMap.put("lastName","Jos");
oldMap.put("userName","YNJos");
oldMap.put("age","33");

newMap.put("initials","Y. J.");
newMap.put("firstName","Yogendra");
newMap.put("lastName","Joshi");
newMap.put("userName","YNJoshi");        
newMap.put("age","33");

测试用例运行

Map<String,Boolean> diffMap = Main.scanForDifferences(oldMap, newMap);

Iterator<Map.Entry<String, Boolean>> it = diffMap.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry<String,Boolean> entry = (Map.Entry<String,Boolean>)it.next();
    System.out.println("Field [" + entry.getKey() +"] is " +
                        (entry.getValue()?"NOT ":"") + "different" );
}        

您还应该检查一个值是否存在于一张地图中而不是另一张地图中。

您可以返回 ENUM 而不是布尔值,例如 EQUALDIFFERENTNOT PRESENT ...

【讨论】:

  • 哇哦!这绝对是一个经过深思熟虑的代码 Andrea。完全喜欢它。感谢您提供建议和实际代码。这肯定会帮助我编写高效且可扩展的代码。最好的,约根德拉
【解决方案3】:

你应该把你的 String 转换成一些 Set。

一套用于 OLD,另一套用于 NEW。并且您的各种元素数量的目标也将使用相同的方法来解决。

因为它的设置顺序是一样的。

【讨论】:

  • 为什么设置比arrayList好?或者为什么不使用带有键值的 hashMap。
  • @Bill 我认为他也可以使用 ArrayList。根据他给出的示例,我认为不需要键值对。
  • 是的,同意。否则 OP 必须跟踪索引的含义。 Key-Value 会解决这个问题。只是另一个需要考虑的选择:)
猜你喜欢
  • 1970-01-01
  • 2016-02-27
  • 2011-08-21
  • 1970-01-01
  • 2015-02-24
  • 2021-11-05
  • 1970-01-01
  • 2012-10-26
相关资源
最近更新 更多