Adressage d'éléments d'une array
Bonjour,
Je pense que je vieillis ...
En guise d'objet à données d'entrées pour mon programme, j'ai de grandes arrays à plusieurs types d'éléments, du genre :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| final static Object[] formTarif_Belgacom =
{
new Object[]
{
FormTarif_Libellés_0903.get_FormTarif_Libellés(), // static
new String( "<html><font color=green>Belgacom</font></html>" ),
new Object[]
{ new String( "2010 mai" ),
new String( "2010 mei" )
},
null,
null,
new BigDecimal( 2.345 ),
new BigDecimal( 1.234 )
},
// Ensemble de données tarifaires propres au 10 oct.
new Object[] // [0] : 2010 Mai
{ new Object[] // District A
{ new Object[] //
{ new Object[] // Aanbod
{ new Object[]
{ new String( "Contrat de 1 an" ),
new String( "1 jaar contract" )
},
new Boolean(Prix.indexés.enBooléen()),
new Object[]
{ new Object[]
{ null,
new Object[] // [0] : Normaal
{ new BigDecimal( 50.00 ),
new BigDecimal( 9.91 )
},
new Object[] // [1]
{ new BigDecimal( 50.00 ),
new BigDecimal( 12.89 ),
new BigDecimal( 5.69 )
},
new Object[] // [2]
{ new BigDecimal( 50.00 ),
new BigDecimal( 4.88 )
}
}
}
}
},
new Object[] // Contributions
{ new BigDecimal( 0.303 )
... |
Soit des arrays imbriquées, de longueurs d'éléments variables et de types d'éléments différents.
J'ai aussi une très grande fonction réentrante ajoutant des Strings de libellés à chaque élément de ces objets de données d'entrée, en supprimant certains éléments, ... du genre :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
| private ArrayList<Object> assocLibellésAuxItemsDonnées(Object[] chaîneSource)
{ byte nbreEléments = (byte) chaîneSource.length;
// Pas de multiples threads d'accès ni de modification structurelle.
ArrayList<Object> chaîneCible =
new ArrayList<Object>(nbreEléments);
Object descendant = null;
boucleExtérieure:
for (int index = 0; index < nbreEléments; index++)
{ // Ajout du String se trouvant dans le fichier de libellés.
// Object car élément est de type String, Boolean, Object[], BigDecimal ou null
Object élément = chaîneSource[index];
// ifs et switch-cases imbriqués de ±5.600 lignes !
if (élément instanceof String)
{ switch (nivRéentr[1])
{ case 0: // nivRéentr[1] // Il n'y a pas de String à ce niveau 0.
break;
case 1: // nivRéentr[1]
switch (indexCheminArbor[0])
{ case 0: // indexCheminArbor[0] / nivRéentr[1]=1
// Données identiques pour tous les sous-ensembles inclus dans l'Object indexCheminArbor[0] = 1.
switch (indexCheminArbor[1])
{ case 0: // indexCheminArbor[1] / nivRéentr[1]=3 / indexCheminArbor[0]=0
// FormTarif_Libellés_YYMM
break;
case 1: // indexCheminArbor[1] / nivRéentr[1]=3 / indexCheminArbor[0]=0
// <html><font color=green>Belgacom</font></html>
dénomFournis = (String) élément;
// Libellé déjà fourni en première position dans chaque 'new Object[]' de 'SommaireFormTarif_ComposTarif_YYMM'.
continue boucleExtérieure;
case 2:
// Au cas où String unique (pas Object de deux strings de deux langues.
// Mois d'application du tarif - "2010 mai"
moisDApplication = (String) élément;
break;
case 3: // indexCheminArbor[1] / nivRéentr[1]=3 / indexCheminArbor[0]=0
// Dénominations de formules tarifaires et les statuts
formTarif_DénomDsFichDEntrée[0] = (String) élément;
break;
case 4: // indexCheminArbor[1] / nivRéentr[1]=3 / indexCheminArbor[0]=0
// Dénominations de formules tarifaires et les statuts
break;
case 5: // indexCheminArbor[1] / nivRéentr[1]=3 / indexCheminArbor[0]=0
break;
case 6: // indexCheminArbor[1] / nivRéentr[1]=3 / indexCheminArbor[0]=0
break;
default: // indexCheminArbor[1] / nivRéentr[1]=3 / indexCheminArbor[0]=0
break;
}
break;
case 1: // indexCheminArbor[0] / nivRéentr[1]=1
// Ensemble de données tarifaires propres au YYMM.
// Il n'y a pas de String à ce niveau indexCheminArbor[0]=1.
break;
default: // indexCheminArbor[0] / nivRéentr[1]=0
break;
}
break;
case 2: // nivRéentr[1]
switch (indexCheminArbor[0])
{ case 0: // indexCheminArbor[0] / nivRéentr[1]=2
...
if (élément instanceof Object)
{ switch (nivRéentr[1])
{ case 0: // nivRéentr[1]
switch (indexCheminArbor[0])
{ case 0: // indexCheminArbor[0] / nivRéentr[1]=0
// Entrer dans l'Object '0' de nivRéentr[1]=0 :
break;
case 1: // indexCheminArbor[0] / nivRéentr[1]=0
// Ensemble de données tarifaires propres au YYMM.
// Entrer dans l'Object '1' de nivRéentr[1]=0.
break;
default: // indexCheminArbor[0] / nivRéentr[1]=0
break;
}
break;
case 1: // nivRéentr[1]
switch (indexCheminArbor[0])
{ case 0: // indexCheminArbor[0] / nivRéentr[1]=1
// Entré dans l'objet '0' de nivRéentr[1]=0.
// Données identiques pour tous les sous-ensembles inclus dans le 2e Object.
switch (indexCheminArbor[1])
{ case 0: // indexCheminArbor[1] / nivRéentr[1]=1 / indexCheminArbor[0]=0
// Référence vers 'FormTarif_Libellés_1003'
formTarif_Libellés = (Object[]) élément;
// élément.get_FormTarif_Libellés();
chaîneCible.ensureCapacity(nbreEléments + 70); // Pour tous les libellés à ajouter.
nivRéentr[0] = nivRéentr[1];
indexCheminArbor[nivRéentr[1]]++;
// Ne pas créer l'Object 'FormTarif_Libellés_1003'.
continue boucleExtérieure;
case 2: // indexCheminArbor[1] / nivRéentr[1]=1 / indexCheminArbor[0]=0
// Libellé en deux langues : '2010 mai' toujours en un Object de 2 strings.
élément = (String) chaîneSource[index][0];
break;
case 3: // indexCheminArbor[1] / nivRéentr[1]=1 / indexCheminArbor[0]=0
// Dénomination de la formule tarifaire en 2 strings bilingues.
break;
case 4: // indexCheminArbor[1] / nivRéentr[1]=1 / indexCheminArbor[0]=0
// Statuts d'indexation
break;
case 8: // indexCheminArbor[1] / nivRéentr[1]=1 / indexCheminArbor[0]=0
// nbreElem_lim = (BigDecimal[])((Object[])((Object[])formTarif_Données[0])[8]).length;
break;
default: // indexCheminArbor[1] / nivRéentr[1]=1 / indexCheminArbor[0]=0
break;
}
break;
case 1: // indexCheminArbor[0] / nivRéentr[1]=1 |
Une douzaine de lignes avant la fin, observez le code problématique
Citation:
élément = (String) chaîneSource[index][0];
En mode de déboguage (en NetBeans), j'observe que l'array "new Object[]" est initialisé comme il se doit avec
Code:
1 2 3
| { new String( "2010 mai" ),
new String( "2010 mei" )
}, |
Pour mettre en 'élément' l'une des deux valeurs de cette array initialisée, comment dois-je formuler mon code ? Le compilateur-life rouspète :
Citation:
"Array required; but java.lang.Object found"
Remerciements anticipés.