Java 在集合中迭代两个不同的元素?
我想得到集合中每两个不同元素的对。我认为如果对每个循环使用,我必须以O(n^2)的复杂度进行迭代。如果使用迭代器,我可以有两个迭代器,其中第二个迭代器指向第一个迭代器的下一个,这意味着对于第二个循环,我不必从一开始就循环。然而,我似乎无法正确打印我的方法Java 在集合中迭代两个不同的元素?,java,Java,我想得到集合中每两个不同元素的对。我认为如果对每个循环使用,我必须以O(n^2)的复杂度进行迭代。如果使用迭代器,我可以有两个迭代器,其中第二个迭代器指向第一个迭代器的下一个,这意味着对于第二个循环,我不必从一开始就循环。然而,我似乎无法正确打印我的方法 public static void main(String[] args){ Set<String> s = new HashSet<String>(); s.add("A"); s.add("
public static void main(String[] args){
Set<String> s = new HashSet<String>();
s.add("A");
s.add("B");
s.add("C");
s.add("D");
Iterator<String> itr1 = s.iterator();
while (itr1.hasNext()){
Iterator<String> itr2 = itr1;
String s1 = itr1.next();
while (itr2.hasNext()){
String s2 = itr2.next();
System.out.println(s1 + " " + s2);
}
}
}
然而,我想要的是:
A B
A C
A D
B C
B D
C D
我不这么认为
Iterator<String> itr2 = itr1;
从理论上讲,最好使用数组(或列表)和for
循环来执行您想要执行的操作:
String[] elements = s.toArray(new String[s.size()]);
for (int i = 0; i < elements.length; ++i) {
String s1 = elements[i];
// loop through all successive elements
for (int j = i + 1; j < elements.length; ++j) {
String s2 = elements[j];
System.out.println(s1 + " " + s2);
}
}
String[]elements=s.toArray(新字符串[s.size()]);
对于(int i=0;i
您的一般逻辑是正确的,您的问题是线路
Iterator<String> itr2 = itr1;
迭代器itr2=itr1;
不复制迭代器,而是对两个循环使用相同的迭代器对象
老实说,我认为在这种情况下,使用带有索引变量的简单for循环要比使用循环迭代器容易得多
但是,由于无法使用索引变量对集合进行迭代,因此我建议使用简单列表,或者至少将集合转换为此特定函数的列表:
public static void main(String[] args) {
List<String> s = new ArrayList<String>();
s.add("A");
s.add("B");
s.add("C");
s.add("D");
for (int i = 0; i < s.size(); i++) {
String s1 = s.get(i);
for (int x = i+1; x < s.size(); x++) {
String s2 = s.get(x);
System.out.println(s1 + " " + s2);
}
}
}
publicstaticvoidmain(字符串[]args){
列表s=新的ArrayList();
s、 添加(“A”);
s、 添加(“B”);
s、 添加(“C”);
s、 添加(“D”);
对于(int i=0;i
迭代器itr2=itr1;将导致两个变量指向同一个interator
1.)不要使用无序集
2.)在数组上按索引迭代,这样您就可以重用索引,在第一个索引处开始内部循环注意set不维护顺序。我猜您的问题来自行
迭代器itr2=itr1代码>。因为您通过调用itr2.next()
将它们设置为彼此相等,所以您正在修改第一个迭代器的状态。我认为您可能希望在此时克隆第一个迭代器。Jordan,请注意,对于大O表示法,如果不再次重复整个内部循环(即从i+1开始,或从迭代器的下一个开始),这并不重要。它仍然会被认为是n^2复杂性。对否决票有什么解释吗?简言之,这与公认的答案(在我写作时给出)的解释是一样的,那么问题出在哪里呢?
Iterator<String> itr2 = itr1;
public static void main(String[] args) {
List<String> s = new ArrayList<String>();
s.add("A");
s.add("B");
s.add("C");
s.add("D");
for (int i = 0; i < s.size(); i++) {
String s1 = s.get(i);
for (int x = i+1; x < s.size(); x++) {
String s2 = s.get(x);
System.out.println(s1 + " " + s2);
}
}
}