O código abaixo funciona, mas aqui fica uma dúvida minha, talvéz alguem possa responder:
quando eu declaro um array escrevo
String z[] - Tipo referência[]; e inicializo com - new String[4] - Tipo[tamanho];
No código eu quero criar um array z[4][3][3], portanto declaro
String[][] z[] - Tipo(String[][]) referência[]; e no meu ponto de vista deveria inicializar com - new String[][][4], ou pelo menos
String[3][3][4], para manter o padrão Tipo[tamanho] - mas o compilador aceita apenas String[4][3][3], oque seria Tipo[tamanho][][]
Isso não foge a sintaxe do Java?
import javax.swing.*;
public class Array3 {
public static void main (String arg[]){
//declaração de variáveis
String saida = "";
int k,i,j;
String[][] z[] = new String[4][3][3];
//atribuir valores
for (k=0; k<4; k++){
for (i=0; i<3; i++){
for (j=0; j<3; j++){
z[k][i][j] = "["+k+"]["+i+"]["+j+"]";
}
}
}
for (i=0; i<3; i++){
for (k=0; k<4; k++){
for (j=0; j<3; j++){
saida += z[k][i][j]+",";
}
saida += " ";
}
saida += "n";
}
//saida na tela
JOptionPane.showMessageDialog(null,saida);
System.exit(0);
}
}
O Array que voce quer definir eh um 4x3x3, certo? A sintaxe que voce usou ( String[][] z[] ) eh meio estranha e complicada. O melhor seria fazer direto String z[][][] ou String[][][] z . Depois, o new precisa de todos os tamanhos que voce quer, nao da para deixar algum em braco. Por isso que voce precisa fazer
String z[][][] = new String[4][3][3];
Certamente da maneira que voce fez eh estranho, mas nao invalido.
Esta bastante confusa a tua colocacao.
Rafael
cuidado Rafael!
voce pode deixar espacos em branco sim! Desde que o primeiro esteja preenchido
String z[][][] = new String[4][][];
é perfeitamente plausivel em java, ja que a matriz naoo rpecisa ser retangular (como eh 3 dimensoes, no caso vai ser um paralelepipedo com buracos)
Na verdade essa questão saiu de um teste que se não me engano era alguma simulação para a prova de certificação, e uma pessoa me perguntou por que String[][] z[] era válido.
A miha explicação é que existem dois modos de declarar um array, Tipo referência[] e Tipo[] referência, e a questão misturava os dois tipos de declaração.
Mas se String[][] z[] mistura os dois tipos, quando eu inicializo z eu deveria sequir o padrão new Tipo[tamanho], oque seria
String[][][tamanho], pois se substituir o Tipo String[][] por int seria
int[tamanho]!
não sei se a minha questão ficou clara, realmente é confusa, mas ainda estou com a dúvida.
[i] 10.1 Array Types
An array type is written as the name of an element type followed by some number of empty pairs of square brackets []. The number of bracket pairs indicates the depth of array nesting. An array’s length is not part of its type.[/i]
–
[i] 10.6 Array Initializers
An array initializer may be specified in a declaration, or as part of an array creation expression (§15.10), creating an array and providing some initial values:
ArrayInitializer:
{ VariableInitializersopt ,opt }
VariableInitializers:
VariableInitializer
VariableInitializers , VariableInitializer
The following is repeated from §8.3 to make the presentation here clearer:
VariableInitializer:
Expression
ArrayInitializer
[/i]
Isso é oq diz a Language Specification, fora as convenções de código Java. Acredito que nas provas da Sun não exista esses tipos pois já vi simulados na net que nem code convention usavam… Lamentável…
Este negócio de declarar “[][] z[]” deve funcionar pq o parser deles é muito poderoso e evita bugs no mesmo, mas se caso eu veja algo disso em prova da Sun eu vou criticalos pelo resto de meus dias…
Eh, eu tinha uma vaga lembranca disso, mas a preguica foi maior!
Rafael
Antes de mais nada gostaria de agradecer a todos pela força, mas como não era exatamente a resposta para minha dúvida, fiquei pensando a respeito disso e chequei a uma conclusão intuitiva.
Estou apenas começando a estudar Java e gostaria que alguem me corrigisse se estiver errado ou confirmar se estou certo.
Quando declaro String[][] z[] o Java entende que eu quero um
" array de ‘array de array’ ", portanto para z ele aloca memória para referenciar um String[][][], e quando eu utilizo o new para inicializar z eu ja estou trabalhando com uma referência para String[][][], portanto devo utilizar os cochetes nessa ordem.
A ordem dos [] realmente não importa, mas sim sua quantidade.
String[] s[][]
String[][] s[]
String[][][] s
Com qualquer quantidade de espaços é válido e significa
um array de (array de arrays)
Para construir você pode usar
new String[4][][]
new String[4][3][]
new String[4][3][3]
Lembre-se que arrays são objetos.
Caraca, explicar esse negócio é complicado paca.
Use (Tipo[][][] referencia) que tá novo, acho que todo mundo usa assim ou (Tipo referencia[][][])