Armazenado um vetor unidimensional em um bidimensional varias vezes

4 respostas
C

tenho um vetor de 10 posições, quero passar o conteudo para um outro vetor [6][5] até não sobrar mais posições vazias no vetor bidimensional, tentei de varias formas, me ajudem!

public static final int LINHAS = 6;
public static final int COLUNAS = 5;
private String conteudo[][];
public static final String VAZIO = "V";

public void limpar() {
        for(int i = 0; i < LINHAS; i++)
            for(int j = 0; j < COLUNAS; j++)
                conteudo[i][j] = VAZIO;
    }

public void gerar() {
	    limpar();
	    String n = "";
	    String test[] = {"1","2","3","4","5","6","7","8","9","10"};
	    while(eVazio()){
	    o = 0;
	    for(int i=0; i < LINHAS; i++){
	    for(int j=0; j < COLUNAS; j++){
	    do{
	    conteudo[i][j] = test[o];
	    n += conteudo[i][j]+"\n";
	    o++;
        }
        while(o<10);
        }  
        }
          System.out.println(n);    
    }

   public boolean eVazio()
    {   
      for(int i=0; i<conteudo.length; i++){   
        for(int j=0; j<conteudo[i].length; j++){   
            if(conteudo[i][j].equalsIgnoreCase(VAZIO)){   
                return true;   
            }   
                }   
      }   
      return false;   
    }

4 Respostas

ViniGodoy

Você pode resolver isso facilmente usando um for.

public class Exemplo {
    public static final int LINHAS = 6;
    public static final int COLUNAS = 5;
    private String conteudo[][] = new String[LINHAS][COLUNAS];
    public static final String VAZIO = &quot;V&quot;;

    public void limpar() {
        for (int i = 0; i &lt; LINHAS; i++)
            for (int j = 0; j &lt; COLUNAS; j++)
                conteudo[i][j] = VAZIO;
    }

    public void gerar() {   
        limpar();   
        String test[] = {&quot;1&quot;,&quot;2&quot;,&quot;3&quot;,&quot;4&quot;,&quot;5&quot;,&quot;6&quot;,&quot;7&quot;,&quot;8&quot;,&quot;9&quot;,&quot;10&quot;};
        
        int linha = 0;
        int coluna = 0;

        //Percorremos o vetor test        
        for (int i = 0; i &lt; test.length; i++) {
            conteudo[linha][coluna] = test[i];
            coluna++; //Pulamos para próxima coluna
            if (coluna == COLUNAS) {  //Chegamos na última coluna? Pula uma linha.
                coluna = 0;
                linha++;
            }            
        }
    }
    
    public void imprimir() {
        System.out.println(&quot;Resultado:&quot;);
        for (int i = 0; i &lt; LINHAS; i++) {
            System.out.println();
            for (int j = 0; j &lt; COLUNAS; j++) {                
                System.out.print(conteudo[i][j] + &quot; &quot;);
            }
        }
    }
    public static void main(String[] args) {
        Exemplo exemplo = new Exemplo();
        exemplo.limpar();
        exemplo.gerar();
        exemplo.imprimir();
    }
}
alanclic

faz um for pra percorrer o vetor, e utiliza 2 variaveis pra percorrer a matriz.

int linha = 0;
int coluna = 0;

for (int i = 0; i < vetor.length; i++)
{

   matriz[linha][coluna] = vetor[i];

   coluna++;

   if (i % vetor[i].length)
   {
      linha++;
      coluna = 0; 
   }

}

isso é só uma idéia.
Espero ter ajudado.

Abraços

ViniGodoy

Ok. Existe outra maneira de resolver esse problema, provavelmente muito mais rápida. Mas é menos trivial.
Envolve usar a função System.arrayCopy, do Java. Essa função copia uma matriz unidimensional dentro de outra.
Como ela usa cópia direta de memória, ela é muito mais rápida do que copiar com o for.

Podemos fazer assim:

public void gerar() {   
   limpar();   
   String test[] = {&quot;1&quot;,&quot;2&quot;,&quot;3&quot;,&quot;4&quot;,&quot;5&quot;,&quot;6&quot;,&quot;7&quot;,&quot;8&quot;,&quot;9&quot;,&quot;10&quot;};

   int ultIndice = 0; //Marca qual foi o último índice copiado
   for (int linha = 0; linha &lt; LINHAS; linha++) {
      //Calculamos a posição para iniciar a leitura na matriz original
      int posCopy = Math.min(COLUNAS, test.length - ultIndice);
            
      //Fazemos a cópia da linha inteira usando array copy.
      System.arraycopy(test, linha*COLUNAS, conteudo[linha], 0, posCopy);
            
      //Calculamos o último índice copiado
      ultIndice += posCopy;
            
      //Se  copiamos tudo o que tínhamos para copiar, paramos o loop.
      if (ultIndice == test.length)
         break;
   }
}
ViniGodoy

alanclic:
if (i % vetor[i].length)

Faltou igualar a zero:

if (i % vetor[i].length == 0)

Obs: Num no caso do C++ ou C, isso quase funciona. Bastaria negar a expressão:

if (!(i % vetor[i].length)) //Não funciona em java! Mas em C ou C++, 0 é falso e o resto é verdadeiro!

Ainda sim, como você já está controlando usando variáveis, acho preferível usar um if com ==, como eu fiz ali em cima, ao invés do operador de resto. O código fica mais claro.

Criado 9 de novembro de 2007
Ultima resposta 9 de nov. de 2007
Respostas 4
Participantes 3