Почему хэшсет показывает странное поведение? - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь закодировать простую проблему.Просто для выяснения его, а не продолжающийся конкурс.Вот код

    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

Вывод это приводит к

1 1
1 2
2 3
3 4
4 5
5

Почему вверху есть двойная 1 1 ?Я действительно не понимаю, что я делаю здесь неправильно?Если честно, у меня есть опыт программирования, но я действительно не могу понять, почему это происходит?

1 Ответ

0 голосов
/ 03 июня 2018

Сначала вы добавляете пустой 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 не может равняться u

, тем лучше:

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

    System.out.println(seq[y] + " " + seq[u]);
    count++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...