写的很好,赞一个,你在不停的进步,很有自己的想法:
- package test28;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map;
- import java.util.Map.Entry;
- import java.util.Set;
- /*
- * ①将map集合的key值转变为key+(int)value,并输出转变后的map
- * ②在第①步的基础上(map已经是新map了),
- * 删除map中50<key+(int)value<150的元素,并输出删除数据后的map
- */
- public class MapTest {
- public static void main(String[] args) {
- Map<Integer, String> map = new HashMap<Integer, String>();
- map.put(1, "90");
- map.put(2, "80");
- map.put(3, "70");
- map.put(4, "60");
- map.put(5, "50");
- map.put(6, "40");
- map.put(7, "30");
- map.put(8, "20");
- map.put(9, "10");
- System.out.println("未改变key之前的map:\n" + map);
- System.out.println("改变key之后的map:\n" + setKey(map));
- System.out.println("删除map中50<key+(int)value<150的元素后的map:\n"
- + deleteKey(map));
- }
- /*
- * 该函数用来改变map的键值key
- */
- public static Map<Integer, String> setKey(Map<Integer, String> map) {
- /*
- * 创建两个list用来存放map的键值key和键值所对应的值value
- */
- ArrayList<Integer> keyList = new ArrayList<Integer>();
- ArrayList<String> valueList = new ArrayList<String>();
- //获取map的键值对映射对象集合
- Set<Map.Entry<Integer, String>> entrys = map.entrySet();
- //获取映射集合的迭代器
- Iterator<Entry<Integer, String>> it = entrys.iterator();
-
- while (it.hasNext()) {
- Map.Entry<Integer, String> entry = it.next();
- Integer key = entry.getKey();
- String value = entry.getValue();
- //执行key+(int)value操作,这里用到了Integer将字符串转换成Integer的函数parseInt
- Integer newKey = key + Integer.parseInt(value);
- //将新的键值和map中原先的值添加到对应列表
- keyList.add(newKey);
- valueList.add(value);
- }
- //这里进行了map清除,因为题目中规定操作结束后会返回一个新的map
- map.clear();
- /*
- * 这里重新给map添加值
- */
- for (int i = 0; i < keyList.size(); i++) {
- map.put(keyList.get(i), valueList.get(i));
- }
- //返回map,没有创建新的map对象,只是经过操作后返回具有新的值的map
- return map;
- }
- /*
- * 该函数用来删除map中50<key+(int)value<150的元素,编程思路跟setKey函数差不多,只是需要注意一点:
- * 程序要判断的是经过前面setKey函数操作过的map(新map,当然只是数据新,而不是对象自身新)中键值key大于50
- * 并且小于150。其实这里又经过了一次跟setKey函数差不多的操作,只是没有改变map的值。
- */
- public static Map<Integer, String> deleteKey(Map<Integer, String> map) {
- Set<Map.Entry<Integer, String>> entrys = map.entrySet();
- Iterator<Entry<Integer, String>> it = entrys.iterator();
- ArrayList<Integer> result = new ArrayList<Integer>();
- while (it.hasNext()) {
- Map.Entry<Integer, String> entry = it.next();
- int key = entry.getKey();
- String value = entry.getValue();
- int newKey = key + Integer.parseInt(value);
- /*
- * 这里是需要注意的一点;
- * 经过上面int newKey = key + Integer.parseInt(value);操作后,要将key值存到表示满足
- * 50<key+(int)value<150的列表中,而不是newKey
- */
- if (newKey > 50 && newKey < 150) {
- result.add(key);
- }
-
- }
-
- /*
- * 这个for循环没有写进while块中是因为:
- * 写进去会引发并发修改异常ConcurrentModificationException,因为在迭代器获取元素的同时又在删除数据,
- * 所以会引发数据安全问题
- */
- for (int i = 0; i < result.size(); i++) {
- map.remove(result.get(i));
- }
- return map;
- }
- }
复制代码 |