3

我目前正在处理其中一个用例,其中给您 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 删除重复值但在某些情况下不起作用。

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

谢谢, Yogendra N Joshi

4

3 回答 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 希望这有助于服务。

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

于 2013-05-31T14:02:53.963 回答
1

您应该将您的字符串转换为一些集合。

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

因为它的设置顺序将是相同的。

于 2013-05-31T12:28:32.540 回答
1

可以使用两个HashMap<yourFieldName, yourFieldValue>而不是两个Arrays / Lists / Sets String(或多个随机字符串);

然后,您需要一种方法来通过键比较两个映射的每个值;

结果将是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" );
}        

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

您可以返回一个 ENUM 而不是带有类似EQUAL, DIFFERENT, NOT PRESENT...的布尔值

于 2013-05-31T13:03:26.240 回答