代码之家  ›  专栏  ›  技术社区  ›  lisak

在迭代期间更改hashmap键

  •  18
  • lisak  · 技术社区  · 14 年前

    是否可以在迭代过程中更改同一个hashmap实例的键?因为映射项集没有方法项.setkey()。现在我能想到的是创建另一个哈希图…

    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());
        }
    }
    
    5 回复  |  直到 6 年前
        1
  •  9
  •   Chandra Patni    14 年前

    iterator.remove() HashMap

        2
  •  17
  •   pjmorse    12 年前

    map.put(newkey,map.remove(oldkey));
    
        3
  •  2
  •   Tejas    14 年前

    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
    }
    

        4
  •  0
  •   Elemental    11 年前

        5
  •  0
  •   Robocide    6 年前

    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"
    }