【问题标题】:How to compare a hashSet within a foreach loop iterating through another hashSet Java如何在遍历另一个hashSet Java的foreach循环中比较hashSet
【发布时间】:2015-11-08 07:37:05
【问题描述】:

我正在运行测试以查看我输入到文件中的值是否与我从 API 生成的值相同。所以我有从我的 API 生成的实际值,还有另一个预期值列表。我遇到的问题是我无法进行苹果与苹果的比较。

例子:

Actual = {red, bleu, yellow, purple}
expected = {bleu, red, purple, yellow}

failure: red != bleu, bleu != red, yellow != purple, purple != yellow 

除了向您展示我的代码之外,我不确定如何更好地描述我所说的内容。

这是我的代码:

TreeSet<String> hashSet = (TreeSet<String>) calcGraph.getInputs();
boolean success = true;
String error="";

for(String xpath : hashSet) {

    String actual = someApi(response, expression, xpath);

    for ( String values : data.getDataOutputs().keySet() ) {
        String expected = data.getDataOutputs().get(expectedXpath);

        if ( !expected.equals(actual)) {
            error+= "\nExpected : " + expected +"\nActual: " +actual+"\n";
            success = false;
        } if ( !success ) Assert.fail(error);

    }
}

如何在 1 个 foreach 循环或等效循环中比较这些列表?任何帮助或帮助将不胜感激。

编辑:

            Iterator<String> expectation = expectedList.iterator();
            Iterator<String> actuation = actualList.iterator();

            while((expectation.hasNext()) && (actuation.hasNext())) {

                String exp = expectation.next();
                String act = actuation.next();

                logger.info("Expected: "+exp);
                logger.info("Actual: "+act);

                // Validation check
                if ( !exp.equals(act)) {
                    error+= "\nExpected : " + exp +"\nActual: " +act+"\n";
                    success = false;
                } if ( !success ) Assert.fail(error);
            }

顺序很重要,所以这将失败......

【问题讨论】:

  • for-each 不适合这份工作。你需要一个普通的 for 循环。
  • 我在这里没有看到任何列表。我看到了一个hashSet 变量(这意味着一个HashSet)和一个Mapdata.getExplanationOutputs())。您要比较哪些列表?
  • 你要使用assertj;它有针对此类情况的断言 (assertThat(list1).containsExactlyElementsOf(list2))。
  • 如果您只想知道两个集合是否具有相同的元素,只需使用set1.equals(set2)
  • @fge 我们不知道 OP 使用的是哪个 Map 实现,但如果它没有排序,那么在它的 keySet 上的迭代顺序已经没有意义了。

标签: java collections foreach conceptual


【解决方案1】:

这个问题太奇怪了。在你说的标题中HashSetHashSet 比较,在你使用的内容中TreeSet

从问题来看,您似乎有实际结果的Set,并且您想与预期结果的Set 进行比较,不管迭代顺序如何,对吗?

使用contains肯定是错误的,使用迭代器进行比较也是如此。

解决方案实际上很简单。来自Set的javadoc:

布尔等于(对象o)

比较指定对象与此集合是否相等。返回真 如果指定的对象也是一个集合,这两个集合具有相同的 大小,并且指定集合的​​每个成员都包含在此集合中 (或者等效地,这个集合的每个成员都包含在 指定集)。此定义确保 equals 方法有效 正确跨 set 接口的不同实现。

你需要做的只是

expectedResultSet.equals(actaulResultSet)

【讨论】:

    【解决方案2】:

    你可以使用

    Set.contains(value)
    

    要检查实际值是否在预期值中,您只需要一个 for 循环即可实现此目的

    看到这个

    http://docs.oracle.com/javase/7/docs/api/java/util/Set.html#contains(java.lang.Object)

    【讨论】:

    • 感谢我稍微重组了我的代码并使用了包含
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    相关资源
    最近更新 更多