[英]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()
的相同問題。 我最后得到了這兩種方法,這些方法已合並到類的equals
和hashCode
實現中。 通用通配符不是必需的(只有String數組),但是我只是想在學習基礎課程時通過方式檢查一下對通用的理解。
我正在考慮避免將來使用數組。 任何意見都非常歡迎。
如果需要比較列表,請嘗試使用該特定列表實例的equals()
提供另一個要比較的實例。
如果需要比較數組,請嘗試使用Arrays.equals()
。
如果在測試方法org.junit.Assert
的assertArrayEquals()
或assertEquals()
中進行此操作,則它們將被調用,因為它們將在后台調用這些方法。
Java文檔需要列表equals()
表現為你使用它,因此,如果這些是你的代碼將工作List
第Lists
:
boolean equals(Object o)
比較指定對象與此列表是否相等。 當且僅當指定對象也是一個列表,並且兩個列表具有相同的大小,並且兩個列表中所有對應的元素對相等時,才返回true。 (如果(e1 == null?e2 == null:e1.equals(e2)),則兩個元素e1和e2相等。)換句話說,如果兩個列表包含相同順序的相同元素,則兩個列表定義為相等。 。 此定義確保equals方法可在List接口的不同實現中正常工作。
但是,在“葉子”處,您具有純Java數組。 這些將使用equals
的Object
定義,該定義測試引用身份,而不是值相等。
解決此問題的一種方法是編寫一個小的幫助程序工廠例程,該例程接受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.