如何在不使用get的情况下有效地从列表中获取项目?

时间:2017-03-05 21:43:57

标签: java

例如我的当前代码,它查找列表中大小为8的所有元素:

 public static void printFamiliesOfLength(int theSize, 
                                    List<AnagramFamily> theFamilies,
                                                PrintStream theOutput) {
        theOutput.println("Families of length: " + theSize);
        theOutput.println("-----------------");
        for(int i = 0; i < theFamilies.size(); i++) {
            if(theFamilies.get(i).getFamilySize() == theSize) {
                theOutput.print(theFamilies.get(i).getCan() + ": ");
                theOutput.println(theFamilies.get(i));
            }
        }
    }

我想要做的是同样的事情,但不使用.get就可以做到。现在我的程序需要10秒才能执行,我想把它降低到1或2秒。考虑使用迭代器但不确定这是否会有所帮助,因为它无论如何都会迭代?

3 个答案:

答案 0 :(得分:2)

使用foreach循环:

for(AnagramFamily anagramFamily: theFamilies) {
    if(anagramFamily.getFamilySize() == theSize) {
        theOutput.print(anagramFamily.getCan() + ": ");
        theOutput.println(anagramFamily);
    }
}

这不会使用get,但我不知道问题是否与get方法有关。

对于性能问题,可以避免在传递大LinkedList并使用get(i)并且每次迭代整个列表时出现的情况。

答案 1 :(得分:1)

如果您想使用Java 8,您可以执行以下操作(示例是带有字符串的列表):

List<String> filteredNames =theFamilies.stream().filter(x ->
x.length()==theSize).collect(Collectors.toList());

filteredNames.forEach(System.out::print);

答案 2 :(得分:1)

您可以创建一个AnagramFamilyCollection类来代替您可以将familySize保存在Map键中的列表。

 public class AnagramFamilyCollection {
     private List<AnagramFamily> anagramFamilies;
     private Map<Integer, List<AnagramFamilies>> familiesSizes;

     public void insert(AnagramFamily anagramFamiliy) {
       anagramFamilies.add(anagramFamiliy);
       addToMap(familiesSizes, anagramFamiliy);
     }

     private void addToMap(Map<Integer, List<AnagramFamilies>> map, AnagramFamily anagramFamiliy) {
       List<AnagramFamily> list = 
       familiesSizes.getOrDefault(anagramFamiliy.getFamilySize(), new ArrayList());
       list.add(anagramFamiliy);
       familiesSizes.put(anagramFamiliy.getFamilySize(), list);
     }

     public List<AnagramFamily> getBySize(int size) {
        return familiesSizes.get(size);
     }
}

然后,你可以在你的方法中使用它。

List<AnagramFamily> theFamilies = anagramFamilyCollection.getBySize(theSize);
for(int i = 0; i < theFamilies.size(); i++) {
      theOutput.print(theFamilies.get(i).getCan() + ": ");
      theOutput.println(theFamilies.get(i));
}