【发布时间】:2016-07-12 05:11:45
【问题描述】:
考虑字符串列表的情况 例如:list=['apple','bat','cow,'dog','applebat','cowbat','dogbark','help']
java 代码必须检查 string 的任何元素是否是另一个元素的子集,如果是,则必须删除更大的 string 元素。
所以在这种情况下,字符串“applebat”、“cowbat”、“dogbark”被删除了。
我采用的方法是获取两个列表并以下列方式遍历它们,
ArrayList<String> list1 = new ArrayList<String>(strings);
ArrayList<String> list2 = new ArrayList<String>(strings);
for(int i = 0; i<list1.size();i++)
{
String curr1 = list1.get(i);
for(int j = 0;j<list2.size();j++)
{
String curr2 = list2.get(j);
if(curr2.contains(curr1)&&!curr2.equals(curr1))
{
list2.remove(j);
j--;
}
}
}
重要提示 我有 200K 到 400K 元素大小的列表。我想找到一种方法来提高性能。我什至尝试过哈希集,但它们并没有太大帮助。我遇到了程序花费的时间问题。
任何人都可以建议对我的代码或 java 中的任何其他方法进行任何改进以提高性能吗?
【问题讨论】:
-
我认为您不能在迭代时简单地删除它们。您可以做的是取一个否定条件,然后将其添加到另一个 arrayList
-
尝试
HashSet并检查contains并删除使用remove方法。Set将给我们O(1)(假设的)运行时。 -
我尝试了一小部分字符串并且代码很好,但是当列表变得非常大时,它需要花费大量时间来处理,我不想重复它 n 次开机 n 次两个列表。我想动态减少这两个列表,以便我可以删除很多比较。