简析Map及Map集合的遍历解析、排序

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 简析Map及Map集合的遍历解析、排序

先上效果图:

image.png

 

(效果图中的数据皆来自Map)


扯点犊子:


其实Android对Java基础的要求并不高,虽然Android是基于Java的,但是Android有更多它自己的东西。


但是对于Java基础还是需要充分的了解,这会对你的开发事半功倍,就像英语不好的开发者一样可以看懂代码,但是英语好的开发者效率一定比英语不好的高。




一、Map


Map是以键值对的方式进行数据读写且无序,底层是通过key的hashCode计算hash值,根据hash值得到位置索引,  然后对该位置索引进行读写。


image.png


HashMap


HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。


HashMap底层就是一个数组结构,数组中的每一项又是一个链表。

image.png

二、实战


1.数据源


//添加数据
        map1 = new HashMap<>();
        map1.put(100, 10);
        map1.put(300, 30);
        map1.put(200, 20);
        map1.put(400, 40);
        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < 2; i++) {
            list.add(" ParseMap " + i);
        }
        map2 = new HashMap<>();
        map2.put(100, list);
        map2.put(200, list);
        map2.put(300, list);

2.遍历并排序


a)效果图一。

//把key转为一个集合
        List<Integer> list = new ArrayList<>(map1.keySet());
        //比较器
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer s1, Integer s2) {
                //升序排列 ,降序 把s1 s2调换即可
                return s1.compareTo(s2);
            }
        });
        //遍历得到key和value,添加到集合
        keyList = new ArrayList<>();
        valueList = new ArrayList<>();
        //遍历map的常用方法一
        for (Integer i : list) {
            Log.i("常用方法一", "key = " + i + " , value = " + map1.get(i));
            keyList.add(i);
            valueList.add(map1.get(i));
        }

b)效果图二。

第二种方法没有排序,效果图二中是300、200、100,而数据源添加的顺序是100、200、300,但是显示的效果却是相反的,这是因为Entry是从前向后添加的,也就是最后添加的数据在数组的最前面。



//遍历得到key和value,添加到集合
        keyList = new ArrayList<>();
        valueList = new ArrayList<>();
        //遍历map的常用方法二
        for (Map.Entry<Integer, List<String>> entry : map2.entrySet()) {
            Log.i("常用方法二", "key = " + entry.getKey() + " , value = " + entry.getValue());
            keyList.add(entry.getKey());
            valueList.add(entry.getValue());
        }


三、代码

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.yechaoa.parsemap.MainActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/button1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="解析map并排序" />
        <Button
            android:id="@+id/button2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="解析嵌套map" />
    </LinearLayout>
    <GridView
        android:id="@+id/gridView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:columnWidth="90dp"
        android:horizontalSpacing="10dp"
        android:numColumns="2"
        android:scrollbars="none"
        android:stretchMode="columnWidth"
        android:verticalSpacing="10dp"
        android:visibility="gone" />
    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="10dp"
        android:visibility="gone" />
</LinearLayout>


MainActivity.java

package com.yechaoa.parsemap;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button button1;
    private Button button2;
    private GridView gridView;
    private ListView listView;
    private HashMap<Integer, Integer> map1;
    private HashMap<Integer, List<String>> map2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
        initListener();
    }
    private void initView() {
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        gridView = (GridView) findViewById(R.id.gridView);
        listView = (ListView) findViewById(R.id.listView);
    }
    private void initData() {
        //添加数据
        map1 = new HashMap<>();
        map1.put(100, 10);
        map1.put(300, 30);
        map1.put(200, 20);
        map1.put(400, 40);
        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < 2; i++) {
            list.add(" ParseMap " + i);
        }
        map2 = new HashMap<>();
        map2.put(100, list);
        map2.put(200, list);
        map2.put(300, list);
    }
    private void initListener() {
        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            //为演示效果直接控制样式
            case R.id.button1:
                button2.setTextColor(Color.BLACK);
                button1.setTextColor(Color.RED);
                listView.setVisibility(View.GONE);
                gridView.setVisibility(View.VISIBLE);
                gridView.setAdapter(new GridViewAdapter(this, map1));
                break;
            case R.id.button2:
                button1.setTextColor(Color.BLACK);
                button2.setTextColor(Color.RED);
                gridView.setVisibility(View.GONE);
                listView.setVisibility(View.VISIBLE);
                listView.setAdapter(new ListViewAdapter(this, map2));
                break;
        }
    }
}


GridViewAdapter.java

package com.yechaoa.parsemap;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
/**
 * Created by yechao on 2017/4/21.
 * Describe :
 */
public class GridViewAdapter extends BaseAdapter {
    private Context mContext;
    private Map<Integer, Integer> map1;
    private final List<Integer> keyList;
    private final List<Integer> valueList;
    public GridViewAdapter(Context mContext, Map<Integer, Integer> map1) {
        super();
        this.mContext = mContext;
        this.map1 = map1;
        //把key转为一个集合
        List<Integer> list = new ArrayList<>(map1.keySet());
        //比较器
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer s1, Integer s2) {
                //升序排列 ,降序 把s1 s2调换即可
                return s1.compareTo(s2);
            }
        });
        //遍历得到key和value,添加到集合
        keyList = new ArrayList<>();
        valueList = new ArrayList<>();
        //遍历map的常用方法一
        for (Integer i : list) {
            Log.i("常用方法一", "key = " + i + " , value = " + map1.get(i));
            keyList.add(i);
            valueList.add(map1.get(i));
        }
    }
    @Override
    public int getCount() {
        return map1.size();
    }
    @Override
    public Object getItem(int position) {
        return map1.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(this.mContext).inflate(R.layout.item_gridview, parent, false);
            holder = new ViewHolder();
            holder.item_gv_textView1 = (TextView) convertView.findViewById(R.id.item_gv_textView1);
            holder.item_gv_textView2 = (TextView) convertView.findViewById(R.id.item_gv_textView2);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.item_gv_textView1.setText(String.valueOf("充¥" + keyList.get(position)));
        holder.item_gv_textView2.setText(String.valueOf("送¥" + valueList.get(position)));
        return convertView;
    }
    private class ViewHolder {
        TextView item_gv_textView1;
        TextView item_gv_textView2;
    }
}


ListViewAdapter.java


package com.yechaoa.parsemap;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by yechao on 2017/4/21.
 * Describe :
 */
public class ListViewAdapter extends BaseAdapter {
    private Context mContext;
    private HashMap<Integer, List<String>> map2;
    private List<Integer> keyList;
    private List<List<String>> valueList;
    public ListViewAdapter(Context mContext, HashMap<Integer, List<String>> map2) {
        super();
        this.mContext = mContext;
        this.map2 = map2;
        //遍历得到key和value,添加到集合
        keyList = new ArrayList<>();
        valueList = new ArrayList<>();
        //遍历map的常用方法二
        for (Map.Entry<Integer, List<String>> entry : map2.entrySet()) {
            Log.i("常用方法二", "key = " + entry.getKey() + " , value = " + entry.getValue());
            keyList.add(entry.getKey());
            valueList.add(entry.getValue());
        }
    }
    @Override
    public int getCount() {
        return map2.size();
    }
    @Override
    public Object getItem(int position) {
        return map2.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(this.mContext).inflate(R.layout.item_listview, parent, false);
            holder = new ViewHolder();
            holder.itemLvTitle = (TextView) convertView.findViewById(R.id.item_lv_title);
            holder.itemLvListView = (MyListView) convertView.findViewById(R.id.item_lv_listView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.itemLvTitle.setText(String.valueOf(keyList.get(position)));
        //再把value集合传给嵌套的ListViewSubAdapter
        holder.itemLvListView.setAdapter(new ListViewSubAdapter(mContext, valueList.get(position)));
        return convertView;
    }
    private class ViewHolder {
        TextView itemLvTitle;
        MyListView itemLvListView;
    }
}

目录
相关文章
|
29天前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
38 3
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
67 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
54 0
|
26天前
|
存储 Java API
详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
【10月更文挑战第19天】深入剖析Java Map:不仅是高效存储键值对的数据结构,更是展现设计艺术的典范。本文从基本概念、设计艺术和使用技巧三个方面,详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
41 3
|
13天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
12 0
|
1月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
19 1
|
1月前
|
搜索推荐 Shell
解析排序算法:十大排序方法的工作原理与性能比较
解析排序算法:十大排序方法的工作原理与性能比较
51 9
|
1月前
|
搜索推荐 索引
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理(二)
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理
|
1月前
|
搜索推荐 C++
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理(一)
【初阶数据结构】深度解析七大常见排序|掌握底层逻辑与原理
|
1月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析

推荐镜像

更多