[RESOLVIDO]Logica deficiente

estou tendo alguns problemas com logica nesse algoritimo. talvez falta de estudo… esse codigo esta me retornando um null pointer enquanto eu itero pelas 2 arrays para descobrir se há algum item igual em ambas…

public int finder(String[] first, String[] second) {
		int x = 1;
		
		first = new String[50];
		second = new String[50];
		
		first[0] = "fish";
		first[1] = "jealous";
		first[2] = "fish";
		second[0] = "fish";
		second[1] = "lolipop";
		second[2] = "fish";
		
		for(int i = 0; i < first.length - 1; i++) {
			for(int j = 0; i < second.length - 1; j++){
				if(first[i].equals(second[j])){
					x++;
				}
			}
		}
		return x;
	}

Para começar se vc reinica as variáveis não tem porque passa-las por parâmetro

public int  finder() {  
        int x = 1;  
          
      String[]   first = new String[50];  
      String[]   second = new String[50];  
          //...

pq vc passa o first e o second por parametro se ao entrar no metodo vc “zera” eles?
pq vc cria com tamanho 50 se só usa 3 elementos?
pra q serve o x nessa historia? pra ver qtos repetidos tem? pq se for ele teria q começar com 0 né?
onde ocorre o null? tem como colocar o método num try, catch e mostrar pra gente o printstack dele?

Veja assim…


public   int  finder() {
        int x = 0;

      String[]   first = new String[3];
      String[]   second = new String[3];

        first[0] = "fish";
        first[1] = "jealous";
        first[2] = "fish";
        second[0] = "fish";
        second[1] = "lolipop";
        second[2] = "fish";

        for(int i = 0; i < first.length; i++) {
            for(int j = 0; j < second.length ; j++){
                if(first[i].equals(second[j])){
                    x++;
                }
            }
        }
                System.out.println("valor  "+ x);
        return x;

    }

Bom seguindo a dica do amigo ai encima tb nao entendi porque você colocou parametro

mais o erro que dar é pq as array é de referencia ai os campos nao pode ficar nulo

como você so inicio até a posição 3 os resto dos campos vai ficar nulo por isso o erro

Também não entendi o porque dos parâmetros, mas o ideal seria trabalhar com alguma Coleção como List mas acredito que seja algum exercício e você tenha que fazer com Vetores

bom uma solução se você tiver que deixar algumas posições vazias é ao percorrer no for verificar se é null segue o codigo:

for(int i = 0; i < first.length - 1; i++) { // por acaso você não teria que verificar se tem um repetido na ultima posição if(first[i]==null) continue; for(int j = 0; i < second.length - 1; j++){ //digo o mesmo if(second[j]==null) continue; if(first[i].equals(second[j])){ x++; } } }

Também acho que o x deveria começar com 0.

Até!

desculpa a todos. no final de semana fico sem internet. por isso a demora… sim. colei o codigo errado… os parametros realmente foram um erro…

o codigo esta assim no momento. mesmo assim existem 4 elementos com o nome "fish" mesmo assim. ele só me retorna 3;


public int findMatch() {
		int x = 0;
		
		String[] first = new String[3];
		String[] second = new String[3];
		
		first[0] = "fish";
		first[1] = "jealous";
		first[2] = "fish";
		second[0] = "fish";
		second[1] = "lolipop";
		second[2] = "fish";
		
		for(int i = 0; i < first.length; i++) {
			if(first[i] == null) continue;
			for(int j = i; j < second.length; j++){
				if(second[j] == null) continue;
					if(first[i].equals(second[j])){
					x++;
				}
			}
		}
		return x;
	}

Pensa assim

esse método não teria que fazer isso

fish veriaficar se é igual a fish
fish veriaficar se é igual a lolipop
fish veriaficar se é igual a fish

jealous verificar se é igual a fish
jealous verificar se é igual a lolipop
jealous verificar se é igual a fish

fish veriaficar se é igual a fish
fish veriaficar se é igual a lolipop
fish veriaficar se é igual a fish

então porque no loop interno você faz j = i ??
se ele tem que voltar a verificar desdo inicio??

Então cara, é que seu J inicia com o valor de I.
Com essa lógica vc chega ao resultado 3 mesmo…
Na sua lógica ele não compara a posição de first com todas as posições de second.
Ele compara a posição atual de first com as posições iguais ou maiores em second.

Essa linha

if(first[i].equals(second[j]))

se comporta assim

if(first[0].equals(second[0]))
if(first[0].equals(second[1]))
if(first[0].equals(second[2]))
if(first[1].equals(second[1]))
if(first[1].equals(second[2]))
if(first[2].equals(second[2]))

Se o certo é ter uma saída 4, vc tem que mudar para j=0

Fica assim

public int findMatch() {   
	        int x = 0;   
	           
	        String[] first = new String[3];   
	        String[] second = new String[3];   
	           
	        first[0] = "fish";   
	        first[1] = "jealous";   
	        first[2] = "fish";   
	        second[0] = "fish";   
	        second[1] = "lolipop";   
	        second[2] = "fish";   
	           
	        for(int i = 0; i < first.length; i++) {   
	            if(first[i] == null) continue;   
	            for(int j = 0; j < second.length; j++){   
	                if(second[j] == null) continue;   
	                    if(first[i].equals(second[j])){   
	                    x++;   
	                }   
	            }   
	        }   
	        return x;   
	    }  

Se comportando assim

[code]

if(first[0].equals(second[0]))
if(first[0].equals(second[1]))
if(first[0].equals(second[2]))
if(first[1].equals(second[0]))
if(first[1].equals(second[1]))
if(first[1].equals(second[2]))
if(first[2].equals(second[0]))
if(first[2].equals(second[1]))
if(first[2].equals(second[2]))

agora sim entendi… obrigado… é que vi como exemplo e isso. e fiz o mesmo nesse algoritimo. com a ultima mensagem, finalmente entendi os fors encadeados. obrigado;