比较字符串和返回布尔值

时间:2013-05-31 12:23:35

标签: java string compare scalability equality

我目前正在使用其中一个用例,你会得到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个字段,很可能会发生在未来我们可能会有更多具有新旧价值的字符串我正在寻找一个最佳解决方案,无论新旧有多少都可以使用这些值被添加,并且没有gaz允许if else子句。

我认为有一种可能性是将旧值设为 OldArrayList ,将新值设置为 newArraylist ,然后使用removeAll删除重复值,但这样做无效有些情况。

堆叠上的任何人都可以帮我解决一些如何以最佳方式完成这项工作的建议。

谢谢, Yogendra N Joshi

3 个答案:

答案 0 :(得分:2)

你可以使用lambdaj(download herewebsite)和hamcrest(download herewebsite),这个库对于管理集合非常强大,以下代码非常简单而且完美地运作:

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

注意:这将帮助您假设您可以选择代码。

答案 1 :(得分:1)

您应该将String转换为某些Set。

一套用于OLD,另一套用于NEW。您的元素数量变化的目标也将使用相同的方法解决。

因为它的设定顺序是相同的。

答案 2 :(得分:1)

您可以使用两个HashMap<yourFieldName, yourFieldValue>代替两个Array s / List s / Set s String s(或多个随机字符串); < / p>

然后你需要一种方法来比较两个地图的每个值;

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

如果一个地图中存在一个值而另一个地图中没有值,您也应该检查。

您可以使用 EQUAL DIFFERENT NOT PRESENT <返回ENUM而不是布尔值/ strong> ...