例如我的当前代码,它查找列表中大小为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秒。考虑使用迭代器但不确定这是否会有所帮助,因为它无论如何都会迭代?
答案 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));
}