0

2 つの文字列配列リストを取り込み、どちらか一方のリストにあるが両方にはない値のリストを出力するメソッドを作成しようとしています。重複は許可されていません。

これは私がこれまでに持っているものですが、3つのjunitテストに失敗しています

public static ArrayList<String> getDifference(ArrayList<String> one, ArrayList<String>     two)
{
Set<String> oneSet = new LinkedHashSet<>(one);
ArrayList<String> finalone = new ArrayList<>(oneSet);
Set<String> twoSet = new LinkedHashSet<>(two);
ArrayList<String> finaltwo = new ArrayList<>(twoSet);
Collection<String> result = new ArrayList<String>(finaltwo);
result.removeAll(finalone);
ArrayList<String> list = new ArrayList<String>(result);
return list;
}

私が失敗しているテストは、これを修正するために何ができるかについての助けにはなりません。よろしくお願いします。

    @Test
public void testGetDifferenceWithEmptyListSecond() {
    String[]          un   = { "luke", "leah", "han" };
    String[]          duex = { };
    ArrayList<String> one  = new ArrayList<String>( Arrays.asList( un ));
    ArrayList<String> two  = new ArrayList<String>( Arrays.asList( duex ));

    ArrayList<String> actual = Lab03Two.getDifference( one, two );

    assertEquals( "The number of elements is incorrect", 3, actual.size() );
    assertTrue  ( "The value \"luke\" was not found in the result", actual.contains( "luke" ));
    assertTrue  ( "The value \"leah\" was not found in the result", actual.contains( "leah" ));
    assertTrue  ( "The value \"han\" was not found in the result", actual.contains( "han" ));
}
    @Test
public void testGetDifferenceWithOverlapAndDuplicates() {
    String[]          un   = { "palpatine", "dooku", "vader", "sidius" };
    String[]          duex = { "padme", "vader", "sidius", "ackbar", "padme" };
    ArrayList<String> one  = new ArrayList<String>( Arrays.asList( un ));
    ArrayList<String> two  = new ArrayList<String>( Arrays.asList( duex ));

    ArrayList<String> actual = Lab03Two.getDifference( one, two );

    assertEquals( "The number of elements is incorrect", 4, actual.size() );
    assertTrue  ( "The value \"ackbar\" was not found in the result", actual.contains( "ackbar" ));
    assertTrue  ( "The value \"dooku\" was not found in the result", actual.contains( "dooku" ));
    assertTrue  ( "The value \"padme\" was not found in the result", actual.contains( "padme" ));
    assertTrue  ( "The value \"palpatine\" was not found in the result", actual.contains( "palpatine" ));
}
}

    @Test
public void testGetDifferenceWithNoOverlap() {
    String[]          un   = { "obi-wan", "jar-jar", "anakin" };
    String[]          duex = { "r2-d2", "c-3po" };
    ArrayList<String> one  = new ArrayList<String>( Arrays.asList( un ));
    ArrayList<String> two  = new ArrayList<String>( Arrays.asList( duex ));

    ArrayList<String> actual = Lab03Two.getDifference( one, two );

    assertEquals( "The number of elements is incorrect", 5, actual.size() );
    assertTrue  ( "The value \"obi-wan\" was not found in the result", actual.contains( "obi-wan" ));
    assertTrue  ( "The value \"jar-jar\" was not found in the result", actual.contains( "jar-jar" ));
    assertTrue  ( "The value \"anakin\" was not found in the result", actual.contains( "anakin" ));
    assertTrue  ( "The value \"r2-d2\" was not found in the result", actual.contains( "r2-d2" ));
    assertTrue  ( "The value \"c-3po\" was not found in the result", actual.contains( "c-3po" ));
}
4

3 に答える 3

2

あなたの論理は少しずれています。

Set Union: { A, B } ∪ { B, C } = { A, B, C } [重複のないすべての要素]
Set Intersection: { A, B } ∩ { B, C } = { B } [共通要素] Set Difference: { A, B } / { B, C } = { A } [ 注意、C 要素なし ]

結合を設定したい-交差を設定:(対称差)ここでのクレジットはPhilに行きます

  1. { "パルパティーン", "ドゥークー", "ベイダー", "シディアス" }
  2. { "パドメ"、"ベイダー"、"シディアス"、"アクバー"、"パドメ" }

( 1 ∪ 2 / 1 ∩ 2 )

{ パルパティーン ドゥークー ベイダー シディアス パドメ アクバー } - { パドメ ベイダー } = { パルパティーン ドゥークー シディアス アクバー }

画像例

replaceAll はセットの違いを適用します: ( oneSet の違い twoSet )

トリップアップはremoveAllメソッドから来ています。1で見つかったすべての要素を 2 から削除しますが、1から2見つからなかっすべての要素を追加するわけではありません。

次のコードは、 2 つの集合差分と 1 つの和集合を実行して、対称差分 / 排他的 OR を達成することでテストを修正します。

排他的または (xor)、対称差

public static List<String> getXOR(List<String> oneArray, List<String> twoArray) {

Set<String> oneSet = new HashSet<>(oneArray);
Set<String> twoSet = new HashSet<>(twoArray);

oneSet.removeAll(twoArray);// 1. oneSet / twoArray    ,  oneSet !AND twoArray
twoSet.removeAll(oneArray);// 2. twoSet / oneArray    ,  twoSet !AND oneArray
oneSet.addAll(twoSet);     // 3. oneSet U twoSet      ,  oneSet OR   twoSet

return new ArrayList<String>(oneSet);
}
于 2013-09-25T20:49:27.310 に答える
1
public static ArrayList<String> getDifference(ArrayList<String> one, ArrayList<String> two)
{
    ArrayList<String> list = new ArrayList<String>();

    //iterate over all elements of one
    //if two does not contain it, it's a difference -> add it
    for (String i : one) {
        if (!two.contains(i)) {
            set.add(i);
        }
    }

    //same with two
    for (String i : two) {
        if (!one.contains(i)) {
            set.add(i);
        }
    }

    return list;
}
于 2013-09-25T20:46:49.890 に答える
0

ここでの最も簡単な解決策は、両方のリストを走査し、単語が別のリストに存在するかどうかを確認し、存在しない場合はセットに追加することです。

Set<String> solution = new LinkedHashSet<>();
int n1 = one.size();
int n2 = two.size();
int i=0;
int j=0;
while (i<n1) {
    while (j<n2) {
       if (!one.get(i).equals(two.get(j))) 
            solution.add(one.get(i));
       j++;
    }

    if (i>=n2) {
      solution.add(one.get(i));
    }
    i++;
}

while (j<n2) {
  solution.add(two.get(j));
  j++;
}
于 2013-09-25T20:35:37.573 に答える