簡體   English   中英

如何測試字符串數組列表的相等性

[英]How to test for equality of Lists of String arrays

我想我看不到森林的樹木...如何在“字符串數組列表”中遞歸測試所有元素的相等性(而非同一性)? 這是一個最小的示例:

List<String[]> left = new ArrayList<>();
left.add(new String[]{"one", "two"});

List<String[]> right = new ArrayList<>();
right.add(new String[]{"one", "two"});

System.out.println(left.equals(right) ? "Yeah!" : "This is not what I want.");

我想在單元測試中使用它。

還有一點上下文:我有一個包含幾個字段的類,其中一些是String數組List ,而另一些是String數組的Set 該類是解析器的結果(實際上是解析器級聯中的中間步驟)。 為了測試解析器,我想檢查所討論類的實例是否相等。 IDE自動生成的equals實現在多個List<String[]>Set<String[]>字段上使用Objects.equals調用的級聯,這-我認為--等效於我的最小示例以上已提供。

測試兩個列表的大小是否相同。 然后,如果這樣做,則對它們中的每一個進行迭代,並使用Arrays.equals()比較每對數組。

如果有一個列表列表( List<List<String>> )會更容易,因為可以直接使用equals()比較列表。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.swing.text.html.HTMLDocument.Iterator;


public class test 
{
  public static void main(String args[])
  {

      List<String[]> left = new ArrayList<String[]>();
      left.add(new String[]{"one", "two"});

      List<String[]> right = new ArrayList<String[]>();
      right.add(new String[]{"one", "two"});

      java.util.Iterator<String[]> leftIterator =left.iterator();
      java.util.Iterator<String[]> rightIterator =right.iterator();
      if(left.size() !=right.size())   System.out.println("not equal");
      for(;leftIterator.hasNext();)
      {
         if(Arrays.equals(leftIterator.next(), rightIterator.next())) continue;
         else
         {
             System.out.print("not equal");
             break;
         }
      }


  }
}

您要比較每個列表,並使用布爾值跟蹤它們是否相等。 我不知道有哪個函數可以直接為您執行此操作。

    List<String[]> left = new ArrayList<>();
    left.add(new String[]{"one", "two"});

    List<String[]> right = new ArrayList<>();
    right.add(new String[]{"one", "two"});

    boolean isEqual = true;
    if (left.size() == right.size())
    {
        // Test for equality
        for (int i = 0; i < left.size(); i++)
        {
            // Compare each array in the list
            if (!Arrays.equals(leftArray, rightArray))
            {
                isEqual = false;
                break;
            }
        }
    }
    else
    {
        // The two list are not even the same length, so are not equal.
        isEqual = false;
    }

    System.out.println(isEqual ? "Yeah!" : "This is not what I want.");

感謝大家的投入。 這是我的結果代碼。

protected static boolean equalsCollectionOfArrays(Collection<? extends Object[]> leftCollection,
                                                   Collection<? extends Object[]> rightCollection) {
    if (leftCollection.size() != rightCollection.size()) {
        return false;
    } else {
        Iterator<? extends Object[]> left = leftCollection.iterator();
        Iterator<? extends Object[]> right = rightCollection.iterator();
        while (left.hasNext()) {
            if (!Arrays.equals(left.next(), right.next())) {
                return false;
            }
        }
        return true;
    }
}

protected static int hashCodeCollectionOfArrays(Collection<? extends Object[]> collection) {
    int hash = 3;
    for (Object[] objects : collection) {
        hash = 67 * hash + Arrays.hashCode(objects);
    }
    return hash;
}

原來,我的問題不僅限於List<String[]> ,而且我遇到了Set<String[]>hashCode()的相同問題。 我最后得到了這兩種方法,這些方法已合並到類的equalshashCode實現中。 通用通配符不是必需的(只有String數組),但是我只是想在學習基礎課程時通過方式檢查一下對通用的理解。

我正在考慮避免將來使用數組。 任何意見都非常歡迎。

如果需要比較列表,請嘗試使用該特定列表實例的equals()提供另一個要比較的實例。

如果需要比較數組,請嘗試使用Arrays.equals()

如果在測試方法org.junit.AssertassertArrayEquals()assertEquals()中進行此操作,則它們將被調用,因為它們將在后台調用這些方法。

Java文檔需要列表equals()表現為你使用它,因此,如果這些是你的代碼將工作ListLists

boolean equals(Object o)

比較指定對象與此列表是否相等。 當且僅當指定對象也是一個列表,並且兩個列表具有相同的大小,並且兩個列表中所有對應的元素對相等時,才返回true。 (如果(e1 == null?e2 == null:e1.equals(e2)),則兩個元素e1和e2相等。)換句話說,如果兩個列表包含相同順序的相同元素,則兩個列表定義為相等。 。 此定義確保equals方法可在List接口的不同實現中正常工作。

但是,在“葉子”處,您具有純Java數組。 這些將使用equalsObject定義,該定義測試引用身份,而不是值相等。

解決此問題的一種方法是編寫一個小的幫助程序工廠例程,該例程接受String的可變參數列表並產生List返回值來替換您當前使用的Java數組。 然后所有人都應該工作正常。 您的示例如下所示:

// A little helper to avoid the awkward syntax
// Arrays.asList(new String [] { "one", "two" })
public static List<String> listOf(String ... strings) {
    return Arrays.asList(strings);
}

public static void main(String[] args) {
    List<List<String>> left = new ArrayList<>();
    left.add(listOf("one", "two"));

    List<List<String>> right = new ArrayList<>();
    right.add(listOf("one", "two"));

    System.out.println(left.equals(right) ? "Yeah!" : "This is not what I want.");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM