Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在集合中迭代两个不同的元素?_Java - Fatal编程技术网

Java 在集合中迭代两个不同的元素?

Java 在集合中迭代两个不同的元素?,java,Java,我想得到集合中每两个不同元素的对。我认为如果对每个循环使用,我必须以O(n^2)的复杂度进行迭代。如果使用迭代器,我可以有两个迭代器,其中第二个迭代器指向第一个迭代器的下一个,这意味着对于第二个循环,我不必从一开始就循环。然而,我似乎无法正确打印我的方法 public static void main(String[] args){ Set<String> s = new HashSet<String>(); s.add("A"); s.add("

我想得到集合中每两个不同元素的对。我认为如果对每个循环使用,我必须以O(n^2)的复杂度进行迭代。如果使用迭代器,我可以有两个迭代器,其中第二个迭代器指向第一个迭代器的下一个,这意味着对于第二个循环,我不必从一开始就循环。然而,我似乎无法正确打印我的方法

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);
        }
    }
}