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