Retornar posição de um elemento na matriz

Boa noite, sou estudante de ADS e estou com dúvida em relação a retornar a posição de um elemento na matriz
A pergunta “c. Um método que receba como parâmetro um determinado valor e retorne o índice da(s) linha(s) e coluna(s) onde o elemento foi encontrado na matriz.”

Fiz o seguinte código

public int contarValor(int numero){
        int cont=0;
        for(int linhas=0;linhas<matriz.length;linhas++){
            for(int colunas=0;colunas<matriz[linhas].length;colunas++){
                if(matriz[linhas][colunas]== numero){
                    cont++;
            }
        }
    }
    return cont;
    } 
    public int[][] returnPos(int numero){
        int[][]valor=new int[contarValor(numero)][contarValor(numero)];
         int aux=0;
         int aux2=0;
         for(int linhas=0;linhas<matriz.length;linhas++){
             for(int colunas=0;colunas<matriz[linhas].length;colunas++){
                 if(matriz[linhas][colunas]==numero){
                     valor[aux][aux2]=colunas;
                     valor[aux][aux2]=linhas;
                     aux++;
                     aux2++;
                 }
             }
                 
    }
    return valor;
    }

para procurar usando o jframe coloquei essa função no botão

int numero = Integer.parseInt(JOptionPane.showInputDialog(null,“Qual número deseja procurar?”));
String resultado="";
for(int i=0;i<construtor.returnPos(numero).length;i++){//linha
for(int k=0;k<construtor.returnPos(numero).length;k++){//colunas
resultado=resultado+construtor.returnPos(numero)[i][k]+"\t";
}
}
jTAResultado.setText(construtor.dados()+"\nIndices iguais ao valor inseiro: " + resultado);

Gerei aleatoriamente uma matriz rodando o sistema 4x5

3 7 5 4 4
6 3 0 4 6
0 2 1 4 8
1 5 0 4 7

E pedi parar procurar o número 4, pelo que entendi do problema era pra retornar o número 4 na linha 0 e coluna 3 , linha 0 linha 4 e assim por diante.

mas retornou isso:
"Indices iguais ao valor inseiro: 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 3 "

Alguma solução?

Você tem que finalizar os laços (for) quando o valor for encontrado.
Exemplo:

import java.util.Random;
import java.util.Scanner;

public class Teste {
	private int linha;
	private int coluna;
	private int[][] matriz;
	
	public void gerarMatriz(){
		Random random = new Random();
		matriz = new int[getLinha()][getColuna()];
		
		for(int i = 0; i < this.getLinha(); i++){
			for(int j = 0; j < this.getColuna(); j++){
				matriz[i][j] = (1 + random.nextInt(50));
			}
		}
	}
	
	public void exibirMatriz(){
		System.out.println("\n");
		
		for(int i = 0; i < this.getLinha(); i++){
			for(int j = 0; j < this.getColuna(); j++){
				System.out.printf("%02d ", matriz[i][j]);
			}
			System.out.println("");
		}
	}
	
	public int[] procurarItem(int valor){
		int[] resultado = new int[3];
		
		for(int i = 0; i < this.getLinha(); i++){
			for(int j = 0; j < this.getColuna(); j++){
				if(matriz[i][j] == valor){
					resultado[0] = i;
					resultado[1] = j;
					resultado[2] = matriz[i][j];
					
					break;
					
				}else{
					resultado[0] = -1;
					resultado[1] = -1;
					resultado[2] = 0;
				}
			}
			if(resultado[0] != -1)
				break;
		}
		return resultado;
	}
	
	public static void main(String[] args){
		int valorProcurado;
		Scanner leitor = new Scanner(System.in);
		
		Teste teste = new Teste();
		teste.setLinha(2);
		teste.setColuna(3);
		teste.gerarMatriz();
		teste.exibirMatriz();
		
		System.out.print("\nValor a ser procurado: ");
		valorProcurado = leitor.nextInt();
		
		int[] resultado = new int[3];
		resultado = teste.procurarItem(valorProcurado);
		
		if(resultado[0] != -1){
			System.out.println("O valor " + valorProcurado + " foi encontrado: " 
			+ "[" + resultado[0] + "]" 
			+ "[" + resultado[1] + "] = " 
			+ resultado[2]);
			
		}else
			System.out.println("O valor não foi encontrado!");
	}
	
	public void setLinha(int l){
		this.linha = l;
	}
	
	public int getLinha(){
		return linha;
	}
	
	public void setColuna(int c){
		this.coluna = c;
	}
	
	public int getColuna(){
		return coluna;
	}
}

image

No método procurarItem você declarou como vetor, nesse caso de procurar algo dentro de matriz não pode ser outra matriz? E por que um vetor com 3 elementos?

Na parte do botão, não preciso de outro for?

Como diria o meu professor: “Uma coisa para cada coisa”. Eu preciso retornar:

1 - a linha
2 - a coluna
3 - o valor indicado pela linha e pela coluna.

Para que eu faria uma matriz 3 x 1? Não é mais inteligente fazer um simples vetor de 3 posições? A menos que o problema exija como retorno uma matriz, não vejo necessidade lógica. Eu preciso retornar três valores. Na grande maioria das linguagens de programação, há somente um retorno. Logo, para retornar três valores, eu retorno um único vetor com os meus três valores.
A única função do botão seria, pelo menos a meu ver, chamar o método para ele fazer a sua parte, ou seja, os métodos devem ter pouca responsabilidade (resolver uma pequena parte do problema maior), mas resolver bem. Logo, o handler do botão (manipulador do evento) deve se ocupar com outras coisas, como por exemplo, simplesmente chamar o método conveniente para resolver uma porção do problema.

Eu entendi mas no tempo de réplica sua fui tentando e resolvi dessa forma.

Fiz um métodos para contar os valores.

      public int contarValor(int numero) {
    int cont = 0;
    for (int linhas = 0; linhas < matriz.length; linhas++) {
        for (int colunas = 0; colunas < matriz[linhas].length; colunas++) {
            if (matriz[linhas][colunas] == numero) {
                cont++;
            }
        }
    }
    return cont;
}

E para retornar posição fiz isso.

public String returnPos(int numero) { 

StringBuilder valor = new StringBuilder();
for (int linhas = 0; linhas < matriz.length; linhas++) {
for (int colunas = 0; colunas < matriz[linhas].length; colunas++) {
if (matriz[linhas][colunas] == numero) {
valor.append("\nColuna: “).append(colunas + 1).append(”\nLinha: “).append(linhas + 1).append(”\n");
}
}
}
return valor.toString();
}

e chamei isso no botão

te void jBPosicaoActionPerformed(java.awt.event.ActionEvent evt) {                                          
    int numero = Integer.parseInt(JOptionPane.showInputDialog(null,"Qual número deseja procurar?"));
    
    if(construtor.contarValor(numero) > 0){
        jTAResultado.setText(construtor.dados() +"\nO número procurado foi: " + numero + "\nO valor foi encontrado nas posições: "+  construtor.returnPos(numero));
    }
    else{
        jTAResultado.setText(construtor.dados()+"\nO valor não foi encontrado");
    }

Obrigado pela resposta!