3

私は現在、以下に示すように、3 つの oldValues と 3 つの newValues を持つ 6 つの文字列が与えられるユースケースの 1 つに取り組んでいます。

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 句を使用する必要はありません。

私が考えた 1 つの可能性は、古い値をOldArrayListとして、新しい値をnewArraylistとして保持し、removeAll を使用して重複する値を削除することでしたが、場合によっては機能しません。

スタック上の誰でも、これを行う最適な方法についてのいくつかの指針を教えてくれますか?

ありがとう、ヨゲンドラ・N・ジョシ

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
    }
}

このライブラリを使用すると、問題を 1 行で解決できます。プロジェクトに次を追加する必要があります: hamcrest-all-1.3.jar および lambdaj-2.4.jar この助けが役立つことを願っています。

注: これは、コードに代わるものがあると仮定するのに役立ちます。

于 2013-05-31T14:02:53.963 に答える
1

String を Set に変換する必要があります。

OLD 用に 1 セット、NEW 用にもう 1 セット。また、さまざまな数の要素の目標も、同じものを使用して解決されます。

設定されているため、同じ順序になります。

于 2013-05-31T12:28:32.540 に答える
1

2 つの s / s / sのHashMap<yourFieldName, yourFieldValue>代わりに 2 つ(または複数のランダムな文字列)を使用できます。ArrayListSetString

次に、両方のマップの各値をキーで比較する方法が必要です。

結果は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" );
}        

値が 1 つのマップに存在し、別のマップには存在しないかどうかも確認する必要があります。

EQUAL, DIFFERENT, NOT PRESENT...のようなブール値の代わりに ENUM を返すことができます。

于 2013-05-31T13:03:26.240 に答える