web-dev-qa-db-fra.com

Comment initialiser un arraylist à deux colonnes?

Je dois créer une liste qui enregistre deux colonnes {int, String}. Je pense que ArrayList est ce dont j'ai besoin mais je ne peux pas comprendre. J'ai extrait les chaînes d'une base de données et int est la valeur d'index dont j'ai besoin pour identifier la position des chaînes pour plus tard.

List<List<String>> strArray = ArrayList<List<String>>;

puis-je faire quelque chose comme strArray.add (). add () pour chaque ligne extraite de la base de données?

6
tozhan

Je pense que vous devriez utiliser HashMap avec int comme clé et String comme valeur si vos valeurs int seront uniques.

Map<Integer,String> myMap = new HashMap<Integer,String>();
myMap.put(1,"ABC");

Notez que Map étant une collection et que les collections Java ne stockent pas les primitives comme int, elles stockent des objets. Vous devez donc utiliser la classe wrapper Integer pour vos valeurs int.

Refer this link Pourquoi les collections Java ne peuvent-elles pas stocker directement des types Primitives?

13
Abubakkar

Une autre approche serait de créer un objet personnalisé:

Class CustomObject {
    int value1;
    String value2;

    CustomObject(int v1, String v2) {
        value1 = v1;
        value2 = v2;
    }
}

Et puis l'utiliser:

List<CustomObject> myList = new ArrayList<CustomObject>();
CustomObject o1 = new CustomObject(1, "one");
myList.add(o1);
// etc.

Si les valeurs int sont uniques et que vous souhaitez les considérer comme des clés, une Map fonctionnerait comme l'ont suggéré d'autres.

14
The111

Si vous avez besoin de deux valeurs, vous pouvez utiliser native Pair class

List<Pair> mPairs = new ArrayList<Pair>();

Pair pair = new Pair(123,"your string");
mPairs.add(pair);

Ce sera une bonne décision si vos valeurs int ne sont pas uniques et vous ne pouvez donc pas utiliser HashMap.

4
Zzokk

Si vos identifiants ne sont pas uniques, vous pouvez toujours utiliser Map:

Map<Integer, String> map = new IdentityHashMap<Integer, String>();
map.put(new Integer(1), "string");

IdentityHashMap - utilisez une implémentation native hashCode pour chaque OBJET. Par conséquent, vous n'avez pas besoin d'identifiants uniques, mais vous DEVEZ créer TOUS les entiers via l'opérateur 'new', et ne pas utiliser l'autoboxing, car il existe un mécanisme de cache .

Il existe également un paramètre JVM, qui contrôle la taille du cache '-XX: AutoBoxCacheMax ='. Mais en utilisant ce paramètre, vous ne pouvez pas désactiver le cache. Si vous définissez une taille égale à zéro, le cache l’ignorera et utilisera la valeur par défaut: [-128; 127]. Ce paramètre est seulement pour les entiers, il n'y a pas ce genre de paramètre pour Long.

UPDATEPour les clés non uniques, vous pouvez utiliser une sorte de carte multiple: Carte> carte

Et stockez-y vos valeurs avec des clés non uniques:

map.put(1, new ArrayList<String>());
map.get(1).add("value1");
map.get(1).add("value2");

Vous pouvez utiliser HashMap pour cela par exemple.

Vous pouvez également trouver l'implémentation MultiMap dans google-collections: 'guava'.

1
kornero

Je pense que vous pouvez envelopper le int et la chaîne dans une classe, puis mettre les objets de classe dans List.

0
TieDad

La carte est un objet qui associe les clés aux valeurs. Une carte ne peut pas contenir de clés en double. chaque clé peut correspondre à au plus une valeur.

Je pense que ce serait mieux si vous utilisiez Map<Integer,String>key(Integer) serait l'index qui pointera sur String.

Map<Integer,String> map = new HashMap<Integer,String>();
map.put(1,"str1");
map.put(2,"str2");
...
0