为什么hashset显示奇怪的行为?

时间:2018-06-03 18:40:36

标签: java if-statement hashset

我正在尝试编写一个简单的问题。只是为了澄清它,而不是正在进行的比赛。 这是代码

    package Algorithms;

import java.util.HashSet;
import java.util.Scanner;

public class shino {
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int seq[]= new int[a];
        int count=0;
        for(int j=0;j<a;j++){
            seq[j] = sc.nextInt();
        }
        HashSet<HashSet> hashSets = new HashSet<>();


            for(int y=0;y<seq.length;y++){

                for(int u=0;u<seq.length;u++){

                    HashSet<Integer> hash = new HashSet<>();
                    int q =Math.abs(y-u);
                    if(y!=u && q==1 ) {

                        hash.add(seq[y]);
                        hash.add(seq[u]);
                    }
                    if(hashSets.add(hash)){
                        System.out.println(seq[y]+" "+seq[u]);
                        count++;
                    }
                }
            }
            System.out.println(count);

    }
}

现在你可以看到有一个 y!= u 的情况,但是当我把输入作为

5
1 2 3 4 5

输出它yealds

1 1
1 2
2 3
3 4
4 5
5

为什么顶部有两个 1 1 ? 我真的不知道我在这里做错了什么? 说实话,我确实有一些编程exp,但我真的无法弄清楚为什么会这样?

1 个答案:

答案 0 :(得分:2)

你是第一次添加空的HashSet,只允许一个建议你的第二个布尔测试是不好的:

HashSet<Integer> hash = new HashSet<>();
int q =Math.abs(y-u);
if(y!=u && q==1 ) {
    hash.add(seq[y]);
    hash.add(seq[u]);
}
if(hashSets.add(hash)){
    System.out.println(seq[y]+" "+seq[u]);
    count++;
}

而是将所有内容放在第一个if块中:

HashSet<Integer> hash = new HashSet<>();
int q = Math.abs(y-u);
if(y != u && q == 1 ) {
    hash.add(seq[y]);
    hash.add(seq[u]);

    System.out.println(seq[y] + " " + seq[u]);
    count++;
}

注意:为什么要测试y != u,因为如果q == 1,y 不能等于你

更好的是:

if (q == 1) {
    hash.add(seq[y]);
    hash.add(seq[u]);

    System.out.println(seq[y] + " " + seq[u]);
    count++;
}