El cambio de HashMap claves durante la iteración

es posible cambiar las claves de la misma HashMap instancia durante la iteración ? Porque la entrada de mapa de conjunto no tiene un método de entrada.setKey(). Ahora lo que puedo pensar fuera es crear otro HashMap…

MultipartParsingResult parsingResult = parseRequest(request);

Map<String, String[]> mpParams = parsingResult.getMultipartParameters();
Map<String, String[]> mpParams2 = new HashMap<String, String[]>();

Iterator<Entry<String,String[]>> it = mpParams.entrySet().iterator();

while (it.hasNext()) {
    Entry<String,String[]> entry = it.next();
    String name = entry.getKey();

    if (name.startsWith(portletNamespace)) {
        mpParams2.put(name.substring(portletNamespace.length(), name.length()), entry.getValue());
    }
    else {
        mpParams2.put(name, entry.getValue());
    }
}
InformationsquelleAutor lisak | 2010-11-21

5 Kommentare

  1. 9

    Usted debe mantener la información en otra colección para modificarlo después de la iteración. Solo puede eliminar la entrada con iterator.remove() durante el iterador. HashMap contrato prohíbe la mutación durante la iteración.

    • Usted puede nunca cambiar un valor de clave en un Mapa.
    • así que desde el punto de vista del rendimiento, es la solución que tengo aquí ¿de acuerdo ? Porque no va a ser de miles de estas llamadas por hora
    • lo que me voy a cambiar aquí sólo están las claves de un mapa
    • Ese es mi punto. Usted no puede cambiar el valor de un objeto clave en un Mapa. Ver el Javadoc de Mapa.
  2. 17

    Tal vez esto ayuda a:

    map.put(newkey,map.remove(oldkey));
    • Si estoy de iterar sobre el conjunto de claves, es este recién añadido clave va a aparecer en el actual conjunto de claves?
  3. 2

    Hay cuatro tipos comunes de modificación es posible que desee hacer a las claves o valores en un HashMap.

    1. A cambio de un HashMap clave, busque el valor objeto de obtener, a continuación, retire la clave antigua y poner la nueva clave.
    2. Para cambiar los campos de un objeto de valor, buscar el valor objeto de seguridad de claves con obtener, a continuación, utilizar sus métodos setter.
    3. Para reemplazar el objeto de valor en su totalidad, sólo hay que poner un nuevo objeto de valor en la clave antigua.
    4. Para reemplazar el objeto de valor con uno basado en la edad, mira el valor del objeto con obtener, crear un nuevo objeto, copia los datos a través de la antigua, a continuación, poner el nuevo objeto en la misma clave.

    Algo como en este ejemplo.

    static class Food
        {
        //------------------------------ FIELDS ------------------------------
    
        String colour;
    
        String name;
    
        float caloriesPerGram;
        //-------------------------- PUBLIC INSTANCE  METHODS --------------------------
    
        public float getCaloriesPerGram()
            {
            return caloriesPerGram;
            }
    
        public void setCaloriesPerGram( final float caloriesPerGram )
            {
            this.caloriesPerGram = caloriesPerGram;
            }
    
        public String getColour()
            {
            return colour;
            }
    
        public void setColour( final String colour )
            {
            this.colour = colour;
            }
    
        public String getName()
            {
            return name;
            }
    
        public void setName( final String name )
            {
            this.name = name;
            }
    
        public String toString()
            {
            return name + " : " + colour + " : " + caloriesPerGram;
            }
    
        //--------------------------- CONSTRUCTORS ---------------------------
    
        Food( final String name, final String colour, final float caloriesPerGram )
            {
            this.name = name;
            this.colour = colour;
            this.caloriesPerGram = caloriesPerGram;
            }
        }
    
    //--------------------------- main() method ---------------------------
    
    /**
     * Sample code to TEST HashMap Modifying
     *
     * @param args not used
     */
    public static void main( String[] args )
        {
        //create a new HashMap
        HashMap<String, Food> h = new HashMap<String, Food>( 149
                /* capacity */,
                0.75f
                /* loadfactor */ );
    
        //add some Food objecs to the HashMap
        //see http://www.calorie-charts.net  for calories/gram
        h.put( "sugar", new Food( "sugar", "white", 4.5f ) );
        h.put( "alchol", new Food( "alcohol", "clear", 7.0f ) );
        h.put( "cheddar", new Food( "cheddar", "orange", 4.03f ) );
        h.put( "peas", new Food( "peas", "green", .81f ) );
        h.put( "salmon", new Food( "salmon", "pink", 2.16f ) );
    
        //(1) modify the alcohol key to fix the spelling error in the key.
        Food alc = h.get( "alchol" );
        h.put( "alcohol", alc );
        h.remove( "alchol" );
    
        //(2) modify the value object for sugar key.
        Food sug = h.get( "sugar" );
        sug.setColour( "brown" );
        //do not need to put.
    
        //(3) replace the value object for the cheddar key
        //don't need to get the old value first.
        h.put( "cheddar", new Food( "cheddar", "white", 4.02f ) );
    
        //(4) replace the value object for the peas key with object based on previous
        Food peas = h.get( "peas" );
        h.put( "peas", new Food( peas.getName(), peas.getColour(), peas.getCaloriesPerGram() * 1.05f ) );
    
        //enumerate all the keys in the HashMap in random order
        for ( String key : h.keySet() )
            {
            out.println( key + " = " + h.get( key ).toString() );
            }
        }//end main
    }

    Espero que esto ayude a

  4. 0

    La mejor cosa a hacer es copiar el mapa en uno nuevo con las modificaciones que desee, a continuación, volver a este nuevo mapas y destruir el antiguo.
    Me pregunto ¿cuál es el impacto en el rendimiento de esta solución sin embargo.

  5. 0

    llegué a este hilo cuando yo necesitaba a cambio de las llaves de las entradas de mapa.
    en mi caso tengo un JSON que la representación en un Mapa , lo que significa que puede mantener mapa o en la lista de mapas, aquí está el código:

    private Map<String,Object> changeKeyMap(Map<String, Object> jsonAsMap) throws InterruptedException {
    
        Map<String,Object> mapClone = new LinkedHashMap<>();
        for (Map.Entry<String, Object> entry : jsonAsMap.entrySet()) {
            if (Thread.currentThread().isInterrupted()) throw new InterruptedException();
            Object value = entry.getValue();
            if (entry.getValue() instanceof Map) {
                value = changeKeyMap((Map) entry.getValue());
            } else if (isListOfMaps(entry.getValue())) {
                value = changeKeyListOfMaps((List<Map<String, Object>>) entry.getValue());
            }
            String changedKey = changeSingleKey(entry.getKey());
            mapClone.put(changedKey, value);
        }
        return mapClone;
    }
    
    private List<Map<String,Object>> changeKeyListOfMaps(List<Map<String,Object>> listOfMaps) throws InterruptedException {
        List<Map<String,Object>> newInnerMapList = new ArrayList<>();
        for(Object singleMapFromArray :listOfMaps){
            Map<String,Object> changeKeyedMap = changeKeyMap((Map<String, Object>) singleMapFromArray);
            newInnerMapList.add(changeKeyedMap);
        }
        return newInnerMapList;
    }
    private boolean isListOfMaps(Object object) {
        return object instanceof List && !((List) object).isEmpty() && ((List) object).get(0) instanceof Map;
    }
    
    private String changeSingleKey(String originalKey) {
        return originalKey + "SomeChange"
    }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea