Vic*_*ton 3 java collections if-statement boolean reference
我有点不好意思问这个,因为我确定这是一个非常基本的问题,但经过搜索和思考,我仍然无法解决这个问题.
代码来自一个班级,导师在我的课程收集教程中进行了开发.该类代表具有相关犯罪代码的地区犯罪表.工作表实现为SortedMap,其中键的类型为String(表示区),值为Integers的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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我运行代码,可以看到这有效,但我无法遵循if条件的逻辑.
我的理解是searchCode.retainAll(crimeTable.get(eachDistrict))将评估对列表searchCode的引用,并且,此时,如果eachDistrict的Map条目具有crimeCode,则searchCode将包含crimeCode参数给出的单个值在它的一组值或否则将为空.
据我所知,这不是布尔值,因此不能用作没有比较运算符的if条件.
有人可以解释一下我缺少的东西吗?
这是非常糟糕的代码.但是,这是它的工作原理:
如果列表因操作而更改,则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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但即便如此,通过使用更少的代码并执行得更好,可以改进:
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
最后一个版本避免了所有的大量调用get()
.它是编码它的最精英方式.建议你的老师顺便找一份工作.