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

Java 如何在不使用get的情况下有效地从列表中获取项目?,java,Java,例如,我的当前代码查找列表中大小为8的所有元素: public static void printFamiliesOfLength(int theSize, List<AnagramFamily> theFamilies, PrintStream theOutput) { theOutput.pri

例如,我的当前代码查找列表中大小为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));
            }
        }
    }
public static void printFamiliesOfLength(内部尺寸,
列出家庭成员,
打印流(输出){
println(“长度系列:+theSize”);
输出打印项次(“-------------------”;
for(int i=0;i

我试着做的是同样的事情,但是不使用。获取。现在我的程序需要10秒来执行,我想把时间减少到1到2秒。考虑使用迭代器,但不确定这是否会有帮助,因为这是一种通过任何方式进行的迭代?

使用
foreach
循环:

for(AnagramFamily anagramFamily: theFamilies) {
    if(anagramFamily.getFamilySize() == theSize) {
        theOutput.print(anagramFamily.getCan() + ": ");
        theOutput.println(anagramFamily);
    }
}
这不会使用get,但我不知道问题是否出在
get
方法上


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

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

List filteredNames=theFamilies.stream().filter(x->
x、 length()==theSize.collect(Collectors.toList());
filteredNames.forEach(系统输出::打印);

您可以创建一个要使用的
AnagramFamilyCollection
类,而不是可以在地图键中保存
familySize
的列表

 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);
     }
}
公共类AnagramFamilyCollection{
私人名单anagramFamilies;
私人地图家庭规模;
公共无效插入(AnagramFamily AnagramFamily){
添加(anagramFamilies);
addToMap(家庭规模、综合家庭);
}
私有void addToMap(地图地图,AnagramFamily AnagramFamily){
列表=
getOrDefault(anagramFamiliy.getFamilySize(),newArrayList());
列表。添加(anagram家庭);
familiesSizes.put(anagramFamiliy.getFamilySize(),list);
}
公共列表getBySize(整数大小){
返回FamiliesSize.get(大小);
}
}
然后,你可以像这样在你的方法中使用它

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));
}
List theFamilies=anagramFamilyCollection.getBySize(theSize);
for(int i=0;i
getFamilySize
是一个简单的getter吗?或者您是否在此处执行其他逻辑?因为输入仅定义为接口
列表
,这至少可以避免将潜在的
链接列表
传递到此处时出现性能问题。这是出于某种原因。从11秒到1.2秒,谢谢。但我不知道为什么这样做会更快。有人知道为什么吗?这里肯定还有别的事。没有理由说for-each循环比传统的for循环快9倍以上。请只分析printFamiliesOfLength方法,而不是整个程序。
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));
}