用于较少项目的循环操作

时间:2019-02-14 13:52:46

标签: java

例如,要从包含音频,视频,图像等的文件列表中仅选择音频,我正在使用以下代码。

private void selectAllAudio() {
    for(Entity entity: entities){
        if(entity.getItemType() == ItemType.Audio){
            entity.setSelected(true);
        }
    }
}

上面的代码将循环播放所有1000个项目,其中只有100个项目是音频。所以我只想知道有没有更好的方法来选择所有音频而不是循环播放所有文件。

2 个答案:

答案 0 :(得分:2)

如果迭代是瓶颈,则可以使用其他数据结构。您可以仅为ItemType.Audio个项目维护一个单独的集合。您还可以维护一个Map,其中密钥为ItemType。这两个选项均允许您快速访问您感兴趣的项目。

答案 1 :(得分:0)

好吧,我在这里看不到任何解决方法。
据我了解您的问题,您有一个“固定的”实体对象(这意味着您可以在运行时拥有它,或者以某种方式查询某个对象并获得该对象)。
如您在注释中所述,由于您拥有Java 7,因此实现此目标的唯一方法是通过常规的for循环
如果您来自Java 8或更高版本,那将是另一种方式

private void selectAllAudio() {
entities.stream().filter (s -> entity.getItemType() == ItemType.Audio).peek(object -> object.setSelected(true)).toList(Entity::new);
}
//Use the toList() method only if you then need a List of all Audio Objects


渐近地讲,流和普通迭代应该花费相同的时间,但是,如果要以Big O的效率为目标,则可能需要考虑其他数据结构(即,大多数情况下,对哈希集的基本操作是,constants,但并非总是如此for Lists)。
请注意,有一些Java 7的库(例如this,尽管最近一次更新是在4年以前),该库以某种方式实现Java 8的Lambda表达式和流,但是,我们当然不是在谈论大约是同一件事...:)

相关问题