2017-08-28 1 views
1

En Java, un grand tableau 2D avec un contenu fragmenté est plutôt inefficace en mémoire, car il prend un morceau contigu de mémoire indépendamment des données qui y sont réellement stockées.Quelle serait une alternative consciente de la mémoire à un Java 2D Array clairsemé?

Je cherche une structure de données de remplacement qui peut contenir des éléments dans une position, analogue à une grille, chemin. Je préférerais que l'efficacité de la mémoire soit O (n) où n est le nombre d'éléments de données dans la structure.

À la votre!

+2

Que diriez-vous d'une carte dont la clé est un POJO avec une paire d'indices? (Cela ne sera peut-être pas mieux si vous devez retourner des lignes entières, mais si tout ce que vous faites est d'accéder à des éléments individuels, cela devrait fonctionner correctement.) – ajb

+0

cela? https://stackoverflow.com/questions/45829943/how-to-e-ly-store-small-byte-arrays-in-java Je pense que tout récemment cela a été discuté – Eugene

+1

Si vous ne voulez pas implémenter une nouvelle classe pour le clé de votre carte, vous pouvez simplement utiliser une chaîne de la forme "A_B" où A est l'index dans la première dimension et B est l'index dans la seconde. – bhspencer

Répondre

2

Essayez une carte ou Dictionnaire tuple (X, Y)

Si vous voulez un accès plage linéaire (pour tous les X me donne gamme de Ys), puis les conteneurs qui sont mis en œuvre avec des arbres peuvent encore fonctionner ok. Les tables de hachage seront bonnes pour un accès aléatoire.

Essayez aussi SparseArray

Peu importe ce que votre choix, assurez-vous de:

  1. Comprendre la mise en œuvre sous-jacente, bien que potentiellement pourrait changer au fil du temps.
  2. Mesurer et comparer

mesure beats généralement théorisation

+0

Quelle classe concrète voulez-vous utiliser pour la clé? Proposez-vous l'OP créer une nouvelle classe Tuple pour leur clé et implémenter hashCode()? – bhspencer

+0

@bhspencer Pourrait utiliser 'Map.Entry ', bien que la création d'un nouveau type pour quelque chose comme ceci n'est certainement pas inconnue, vu que Java manque d'un type 'Pair' –

+0

Pour une implémentation simple, vous pouvez également utiliser' String' au format '" X: Y "' (par exemple) – vikingsteve

2

Vous pouvez utiliser un HashMap où la clé contient la position X et Y. Si vous ne voulez pas implémenter une nouvelle classe pour la clé de votre carte, vous pouvez simplement utiliser une chaîne de la forme "X_Y" où X est l'index dans la première dimension et Y est l'index dans la seconde.

Map<String, YourClass> map = new HashMap<>(); 

Pour mettre un élément à la position 2345, 6789, vous feriez ceci:

map.put(2345 + "_" + 6789, yourObject); 

Et pour le récupérer:

YourClass yourObject = map.get(2345 + "_" + 6789); 

Pourquoi choisir cette méthode plus en utilisant une sorte de Tuple? Je pense que la réponse courte est que Java ne vient pas avec une classe Tuple ou Pair. Vous pouvez écrire les vôtres et ajouter vos propres implémentations hashCode() et equals() ou vous pouvez utiliser quelque chose comme Map.Entry<K, V>. Que vous choisissiez une chaîne pour votre clé ou une classe pour votre clé ne fera aucune différence significative au temps d'exécution. Vous perdez une certaine sécurité de type en utilisant une chaîne et vous compensez cela avec une brièveté de code.

+1

Cela créerait un nouveau StringBuilder chaque fois que vous ajouteriez de nouvelles entrées à la carte, trouver des entrées "voisines" nécessiterait également d'analyser la clé donnant plus d'objets 'String', et il manque le type sécurité - pourquoi utiliser un' String' pour ce? –

+0

Est-ce que la concaténation littérale java String crée vraiment un StringBuilder en coulisses? Cela semble plutôt improbable.Je propose d'utiliser un littéral String simple car c'est beaucoup moins de travail que d'utiliser hashCode() et equals() sur une autre classe que vous implémentez. – bhspencer

+0

Cette réponse suggère qu'un StringBuilder n'est pas utilisé pour la concaténation littérale de chaîne https://stackoverflow.com/questions/1532461/stringbuilder-vs-string-concatenation-in-tostring-in-java – bhspencer