比较字符串并返回布尔值

3

我目前正在处理一个使用案例,其中给定了6个字符串,其中包含3个旧值和3个新值,如下所示:

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

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

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

现在,我有3个字段,未来可能会有更多的字符串带有旧值和新值。因此,我正在寻找一种适用于所有情况的最佳解决方案,无论添加了多少旧值和新值都能够工作,并且没有海量的if else语句。
我考虑的一个可能性是将旧值作为“OldArrayList”,新值作为“newArraylist”,然后使用removeAll来删除重复值,但在某些情况下这并不起作用。
请问Stack上有谁能够帮助我指出如何最优地完成此任务的方法?
谢谢, Yogendra N Joshi

1
将每个OldValues和NewValues存储在ArrayList中,这样您就可以保持它们之间的某种关系。然后,您只需比较两个ArrayList中相同索引处的值即可。因此,您将只有一个if-else,但只需循环遍历ArrayList即可。 - Bill
1
首先:return !oldFirstName.equalsIgnoreCase(newFirstName) 就足够了。 - benzonico
1
@benzonico --“……没有成堆的if else语句……” - Bill
3个回答

2
您可以使用 lambdaj(下载链接:点击这里官网)和 hamcrest(下载链接:点击这里官网),这些库非常强大,适用于管理集合。以下代码非常简单且完美运行:
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中的强大功能。谢谢! - Yogendra

1
你可以使用两个 HashMap<yourFieldName, yourFieldValue> 代替两个 Array / List / SetString(或多个随机的字符串);
然后,您需要一个方法来比较两个映射的每个值的键;
结果将是一个 HashMap<String,Boolean>,其中包含每个字段键的名称,如果值在两个地图中相等,则为 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" );
}        

你应该检查一个映射中是否存在某个值,而在另一个映射中不存在。
你可以返回一个枚举类型,例如 EQUALDIFFERENTNOT PRESENT ...,而不是布尔类型。

哇喔!这绝对是经过深思熟虑的代码,Andrea。我非常喜欢它。感谢您提供建议和实际代码。这肯定会帮助我编写高效且可扩展的代码。最好的祝福,Yogendra。 - Yogendra

1
你应该将字符串转换为一些集合。
一个用于旧值,另一个用于新值。并且你的目标是使用相同的方式解决不同数量的元素。
因为它是集合,所以它们的顺序将是相同的。

为什么Set比ArrayList更好?或者为什么不使用带有键值对的HashMap? - Bill
@Bill 我认为他也可以使用 ArrayList。根据他给出的示例,我不认为需要键值对。 - Ketan Bhavsar
是的,同意。否则,OP必须跟踪索引的含义。键值对将会处理这个问题。这只是另一个需要考虑的选项 :) - Bill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接