Question Comment obtenir la position d'un élément depuis Java Map


J'ai cette carte Java:

Pouvez-vous me dire comment je peux obtenir le sixième élément de la carte?

private static final Map<String, Users> cache = new HashMap<>();

Est-ce possible? Ou je dois utiliser une autre collection Java?


13
2017-11-27 10:51


origine


Réponses:


Bien qu'un peu tard pour répondre. Mais l'option est d'utiliser LinkedHashMap: cette carte préserve l'ordre en fonction de l'insertion d'éléments, comme tout le monde l'a suggéré. Cependant, comme avertissement, il a un constructeur LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) qui créera un mappage de hachage lié dont l'ordre d'itération est l'ordre dans lequel ses entrées étaient les dernières accessed. N'utilisez pas ce constructeur pour ce cas.

Cependant, si j'avais besoin d'une telle fonctionnalité, je l'étendrais et implémenterais ma fonction nécessaire pour les réutiliser de la manière suivante:

class MyLinkedMap<K, V> extends LinkedHashMap<K, V>
{

    public V getValue(int i)
    {

       Map.Entry<K, V>entry = this.getEntry(i);
       if(entry == null) return null;

       return entry.getValue();
    }

    public Map.Entry<K, V> getEntry(int i)
    {
        // check if negetive index provided
        Set<Map.Entry<K,V>>entries = entrySet();
        int j = 0;

        for(Map.Entry<K, V>entry : entries)
            if(j++ == i)return entry;

        return null;

    }

}

Maintenant, je peux l'instancier et obtenir une entrée et une valeur dans les deux sens.

MyLinkedMap<String, Integer>map = new MyLinkedMap<>();
map.put("a first", 1);
map.put("a second", 2);
map.put("a third", 3);

System.out.println(map.getValue(2));
System.out.println(map.getEntry(1)); 

Sortie:

3
a second=2

22
2017-11-27 11:38



HashMap ne garantit pas la commande. Si vous vous préoccupez de la commande, vous devez utiliser LinkedHashMap 

Map<String, Users> orderedMap=new LinkedHashMap<>();

Maintenant, quand vous mettez un élément, il gardera la commande ce que vous mettez.

Si vous voulez obtenir le 6ème élément, vous pouvez le faire maintenant puisque vous avez vos éléments en ordre.

 orderedMap.values().toArray()[5]// will give you 6th value in the map. 

Exemple

 Map<String, String> orderedMap=new LinkedHashMap<>();
 orderedMap.put("a","a");
 orderedMap.put("b","b");
 System.out.println(orderedMap.values().toArray()[1]);  // you will get b(value)
 System.out.println(orderedMap.keySet().toArray()[1]);  // you will get b(key)
    }

8
2017-11-27 11:00



Avec goyave Iterables

Iterables.get(map.entrySet(),6);

6
2017-11-27 10:53



UNE HashMap ne conserve pas l'ordre des éléments insérés. Vous pouvez utiliser un LinkedHashMap au lieu de cela, maintient l'ordre des éléments insérés.

Bien que vous ayez besoin de noter que même un LinkedHashMap n'a pas une telle méthode qui donnerait l'élément à un index particulier. Vous devrez parcourir manuellement les entrées et extraire l'élément à la 6ème itération.


5
2017-11-27 10:55



le HashMap n'a pas de classement défini des clés.

Vous pouvez utiliser LinkedHashMap qui stockera vos clés dans l'ordre d'insertion.Vous pouvez les récupérer en appelant keySet ().


5
2017-11-27 10:54



Selon Documentation, HashMap est une implémentation basée sur la table de hachage de l'interface Map. Cette implémentation fournit toutes les opérations de carte facultatives et autorise les valeurs NULL et la clé NULL. (La classe HashMap est à peu près équivalente à Hashtable, sauf qu'elle n'est pas synchronisée et autorise les valeurs NULL.) Cette classe ne fait aucune garantie quant à l'ordre de la carte; en particulier, cela ne garantit pas que la commande restera constante dans le temps. 

C'est pourquoi il n'est pas judicieux d'utiliser ce type de collection.

METTRE À JOUR:

Sur la base de l'implémentation de LinkedHashMap dans @Prateek, je suggérerais quelque chose comme:

LinkedHashMap<String,User> linkedHashMap = new LinkedHashMap<String,User>();
// or LinkedHashMap<String,User> linkedHashMap = new LinkedHashMap<>(); //for java 7+

linkedHashMap.put("1",userObj1);
linkedHashMap.put("2",userObj2);
linkedHashMap.put("3",userObj3);

/* Get by position */
int pos = 1; // Your position
User tmp= (new ArrayList<User>(linkedHashMap.values())).get(pos);
System.out.println(tmp.getName());

3
2017-11-27 10:58



HashMaps ne conservez pas la commande:

LinkedHashMap qui garantit un ordre d'itération prévisible.

Exemple

public class Users 
{
 private String Id;

 public String getId()
 {
    return Id;
 }

 public void setId(String id) 
 {
    Id = id;
 }
}


Users user;
LinkedHashMap<String,Users> linkedHashMap = new LinkedHashMap<String,Users>();

for (int i = 0; i < 3; i++)
{
  user = new Users();
  user.setId("value"+i);
  linkedHashMap.put("key"+i,user);
}

/* Get by position */
int pos = 1;
Users value = (new ArrayList<Users>(linkedHashMap.values())).get(pos);
System.out.println(value.getId());

2
2017-11-27 10:59



Correct!! vous devrez utiliser une autre collection pour obtenir des valeurs sur index (position). Vous pouvez utiliser ArrayList


1
2017-11-27 10:53



UNE HashMap n'a pas de position Vous pouvez parcourir son KeySet ou EntrySet, et choisissez le nième élément, mais ce n'est pas vraiment la même chose qu'une position. UNE LinkedHashMap a une position, car il a un ordre d'itération prévisible.


1
2017-11-27 10:55



Si la commande doit signifier quelque chose de significatif, vous pouvez envisager d'utiliser un SortedMap.

Mise en œuvre concrète: TreeMap


1
2017-11-27 10:55



Vous devez utiliser un LinkedHashMap afin de pouvoir dire l'ordre des éléments insérés. HashMap n'est pas capable de le faire.


1
2017-11-27 10:57