在集合

时间:2016-03-11 10:19:50

标签: java

我必须构建一个过滤器,给定一些元素(博物馆对象)只返回来自特定房间特定世纪的过滤器。我在两个函数之前构建:第一个仅在房间上应用过滤器,第二个仅在世纪上应用,并且两者都正确工作(它们将正确匹配的对象放在名为 filtrati 的ArrayList中) 。这是我实现目标的“第三个功能”:

public Set < Pezzo > filtraSalaSecolo(String sala, int secolo)
        throws IOException {
    Set < Pezzo > filtrati = new HashSet();
    for (Iterator < Pezzo > i = parse().iterator(); i.hasNext();) {
        Pezzo next = i.next();
        if (filtraSala(sala).contains(next) == true && filtraSecolo(
                secolo).contains(next) == true) {
            filtrati.add(next);
        }
    }
    return filtrati;
}

在此代码中Pezzo将是博物馆对象数据的数据结构。代码不能很好地工作,因为测试(下面报告)没有输出。我不明白为什么。

public class FiltraSalaSecoloTest {
    public static void main(String[] args) throws IOException {
        Filtri f = new Filtri();
        f.setFilePath(IFile.PATH_MUSEO);
        for (Iterator < Pezzo > i = f.filtraSalaSecolo(
                "Sala delle scienze moderne", 20).iterator(); i.hasNext();) {
            Pezzo next = i.next();
            System.out.println(next.getAnno() + "\t" + next.getSala());
        }
    }
}

1 个答案:

答案 0 :(得分:0)

你的问题是(猜测这里,因为没有给出代码)你的parse()方法可能每次都返回新对象,所以当你试图过滤时,你问的是如果来自一个parse()的对象包含在另一个hashCode()的对象集中。除非您实施equals()public Set < Pezzo > filtraSalaSecolo(String sala, int secolo) throws IOException { Set < Pezzo > all = parse(); Set < Pezzo > f1 = filtraSala(sala, all); Set < Pezzo > filtrati = filtraSecolo(secolo, f1); return filtrati; } 方法,否则答案将始终为否。

相反,您需要解析一次,然后过滤解析后的结果。即)

Set<Pezzo>

并为filtraSalafiltraSecolo方法添加filtraSalaSecolo参数,该方法是要过滤的集合。

继续重构,Set<Pezzo> filtrati = filtraSalaSecolo(sala, secolo, parse()); 也应该有这个额外的参数,因此它可以被称为:

<input type="hidden" id="listid" name="listid" value="{{ $list->id }}">