Como ver em um int[] se tem os numeros de 1 a 9? JAVA

Gostava de perceber uma forma de como conseguir ver que um array de length 9 tem os digitos 1 até 9.
Fiz este programa, mas apercebi me que não faz nada do presuposto.

public static boolean contem1a9(int[] v)  {
	boolean res = false;
	
	for(int i = 0; i < v.length; i++) {
		if(v[i] == 1 || v[i] == 2 || v[i] == 3 || v[i] == 4 || v[i] == 5 || v[i] == 6 || v[i] == 7 || v[i] ==8 || v[i] == 9) {
		res = true;	
		}
	}
	
	return res;
}
public static boolean contem1a9(int[] v)  {
	for(int i = 0; i < v.length; i++) {
		if(v[i] != (i+1)) {
             return false;
		}
	}

	return true;
}

era tão simples afinal, obrigado

A solução acima só funciona se todos os números estiverem em ordem.

Mas se tiver menos números (ex: apenas 1 e 2, em ordem), ele não valida o tamanho e retorna true, ou se tiver todos de 1 a 9 mas não estão em ordem crescente, aí não funciona mais, veja: https://ideone.com/FiKM1a

Enfim, os números estarão ordenados ou não?
Se estiverem, basta incluir no código acima uma verificação do tamanho, vendo se é 9.

Mas se puderem estar em qualquer ordem, aí já não serve mais…

Uma opção para este caso é ordenar o array primeiro:

public static boolean contem1a9(int[] v)  {
    // se não tem 9 elementos, nem precisa verificar nada
    if (v.length != 9)
        return false;
    Arrays.sort(v);
	for(int i = 0; i < v.length; i++) {
		if (v[i] != i + 1) {
            return false;
		}
	}
 
	return true;
}

O único problema é que esse método altera o array original:

int v[] = {3, 1, 5, 7, 8, 4, 9, 2, 6};
System.out.println(contem1a9(v)); // true
// mas agora o array está ordenado
System.out.println(Arrays.toString(v)); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

Se não quiser modificar o array, você pode ou fazer uma cópia dele:

public static boolean contem1a9(int[] v) {
    // se não tem 9 elementos, nem precisa verificar nada
    if (v.length != 9) {
        return false;
    }
    // cria uma cópia
    int[] copia = Arrays.copyOf(v, v.length);
    Arrays.sort(copia);
    for (int i = 0; i < copia.length; i++) {
        if (copia[i] != i + 1) {
            return false;
        }
    }

    return true;
}

Ou então crie um outro array contendo as ocorrências de cada número (na posição i do array tem a informação se o número i + 1 ocorreu):

public static boolean contem1a9(int[] v) {
    // se não tem 9 elementos, nem precisa verificar nada
    if (v.length != 9) {
        return false;
    }
    // array que indica se um número já ocorreu (por default é inicializado com false)
    boolean [] jaOcorreu = new boolean[v.length];
    for (int i = 0; i < v.length; i++) {
        int n = v[i];
        if (n < 1 || n > 9) {
            return false;
        }
        if (jaOcorreu[n - 1]) { // se o número já ocorreu antes, então está repetido
            return false;
        }
        jaOcorreu[n - 1] = true;
    }

    return true;
}

Alguns testes:

// true
System.out.println(contem1a9(new int[]{3, 1, 5, 7, 8, 4, 9, 2, 6}));

// false (o 7 está repetido)
System.out.println(contem1a9(new int[]{3, 1, 5, 7, 8, 4, 9, 2, 7}));
// false (não tem 9 números)
System.out.println(contem1a9(new int[]{1, 2, 3}));

// false (tem número maior que 9)
System.out.println(contem1a9(new int[]{1, 2, 3, 4, 5, 6, 7, 8, 11}));
1 curtida

muito obrigadoo