3

我有点不好意思问这个问题,因为我确信这是一个非常基本的问题,但是经过搜索和思考后,我仍然无法解决这个问题。

代码来自导师在我的课程集合教程中开发的课程。该类表示具有相关犯罪代码的地区的犯罪表。该工作表实现为 SortedMap,其中键的类型为 String(代表地区),值是整数的 ArrayList(代表犯罪代码)。

有一种方法我们在教程期间未能完成,导师发送了一份副本,我无法遵循逻辑。该方法的代码如下

/**
 * displays districts affected by given crime code
 * 
 *     @param Integer crime code
 *     @return     none
 */
public void displayAffectedDistricts(Integer crimeCode)
{
    ArrayList<Integer> searchCode;
    for(String eachDistrict:  crimeTable.keySet())
    {
        searchCode = new ArrayList<Integer>();
        searchCode.add(crimeCode);
        if(!(searchCode.retainAll(crimeTable.get(eachDistrict))))
        {
           System.out.println("Code "+crimeCode+" found in district "+eachDistrict);
         } 
    }
}

我已经运行了代码,并且可以看到这是可行的,但我无法遵循 if 条件的逻辑。

我的理解是 searchCode.retainAll(crimeTable.get(eachDistrict)) 将评估对列表 searchCode 的引用,并且此时,如果 eachDistrict 的 Map 条目具有 crimeCode,则 searchCode 将包含由 crimeCode 参数给出的单个值在它的一组值中,否则将为空。

据我所知,这不是布尔值,因此不能在没有比较运算符的情况下用作 if 条件。

有人可以解释我缺少什么吗?

4

5 回答 5

8

这是非常糟糕的代码。但是,它是这样工作的:

如果列表因操作而更改,则该retainAll()方法返回。true创建一个包含目标代码的列表,如果另一个列表包含它,则列表不会更改。

如果我要标记它,我会严厉地标记写这篇文章的人,因为它很迟钝。这是一个更好的实现,使用更少的代码,简单易懂,性能也更好:

public void displayAffectedDistricts(Integer crimeCode) {
    for (String eachDistrict : crimeTable.keySet()) {
        if (crimeTable.get(eachDistrict).contains(crimeCode)) {
           System.out.println("Code "+crimeCode+" found in district "+eachDistrict);
        } 
    }
}

但即便如此,也可以通过使用更少的代码更好的性能来改进:

public void displayAffectedDistricts(Integer crimeCode) {
    for (Map.Entry<String, ArrayList<Integer>> entry : crimeTable.entrySet()) {
        if (entry.getValue().contains(crimeCode)) {
           System.out.println("Code "+crimeCode+" found in district "+entry.getKey());
        } 
    }
}

最后一个版本避免了对get(). 这是编码它的最精英的方式。把这个建议给你的老师,顺便说一下,他应该找另一份工作。

于 2013-05-19T12:19:10.873 回答
1

的 javadocretainAll()说:

Returns:
true if this list changed as a result of the call

该方法还可以设计为返回结果列表。但是,这会掩盖更改不是在副本上执行的,而是在原始列表上执行的。此外,知道设置操作是否引起了变化也很方便。

于 2013-05-19T12:19:41.317 回答
1

retainAlltrue如果此列表因调用而更改,则返回。

所以

!(searchCode.retainAll(crimeTable.get(eachDistrict)))

等于

crimeTable.get(eachDistrict).contains(crimeCode)
于 2013-05-19T12:22:07.057 回答
0

retainAll 在 java.util.List 中定义并返回一个布尔值作为返回值。所以这个值可以作为if语句的条件。

于 2013-05-19T12:18:11.277 回答