java基础五 HashMap和HashSet

HashMap简介

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。key和value一一对应,key不得重复

HashMap的定义和声明,<key,value>然后key和value可以是类,interger string,等等

HashMap<String, String> map1 = new HashMap<>();

put()

put() 的作用是对外提供接口,让HashMap对象可以通过put()将“key-value”添加到HashMap中。

map1.put("2", "王宝强");
	map1.put("3", "黄渤");
	map1.put("4", "靳东");
	map1.put("4", "靳");//这里由于key 重复,所以覆盖上面那条
	map1.put("5", null);

get()

get() 的作用是获取key对应的value,它的实现代码如下

String a = map1.get("1");
	System.out.println(a);

size()

int size = map1.size();
System.out.println(size);

remove()

remove() 的作用是删除“键为key”元素

String remove = map1.remove("5"); //移除
	System.out.println(remove);

通过key确认该key对应的value是否还存在的两种方法
方法1:运用get()方法,如果存在返回其value,如果 不存在返null

	String b = map1.get("5");
	System.out.println(b);

方法2:可以利用map的contains功能判断指定的key是否存在,如果存在返回true,不存在,返回 Flase(boolean值)

boolean c = map1.containsKey("5");  // 此方法才能真正确定map中是否存在指定的key
System.out.println(c);
Set<String> keySet =  map1.keySet();

HashSet

HashSet是set接口的实现类,也是我们最常用的set集合
储存的是无序,唯一的对象
由于是无序的所以每组数据都没有索引,很多list可用的方法他都没有
凡是需要通过索引来进行操作的方法都没有
所以也不能使用普通for循环来进行遍历,只有加强型for和迭代器两种遍历方法

1迭代器法
由于这种数据类型的存储是无序的,所以无法直接遍历,开发者为用户构造了迭代器为其遍历所使用
迭代器有三个方法iterator() 迭代器的声明,hasNext() 返回值是boolean类型,用于判断该HashSet中是否还有数据,如果还有数据,就继续将指针后移,next()取出当前位置的数据。

Iterator<News> it = set.iterator();  //首先先进行迭代器的声明  构造迭代器的对象,然后<写的是set中存的数据类型>
while (it.hasNext()) {           //hasNext() 返回值是boolean类型,如果还能取返回true并且游标下移。如果是Flase就取完了,结束
		News n = it.next();   //取出当前位置的数据
		System.out.println(n.getID()+"\t"+n.getLitter()+"\t"+n.getAuthor());
	}

增强型for 增强for循环:内部封装了迭代器的使用
set用增强for遍历

for(News n : set) 这里数据语法如下
set


 for(数据类型 变量:需要遍历的集合)
{
循环体
}

实际例子

for(News n : set){
		System.out.println(n.getID()+"\t"+n.getLitter()+"\t"+n.getAuthor());
	}

// 数组也可以用增强for循环来遍历

int[] arr = new int[] {3,5,7,9,2};
for(int x:arr) {
	System.out.println(x);
}

// arraylist也可以用增强for循环来遍历

ArrayList<Product> pdts = new ArrayList<>();
	pdts.add(new Product("1", "肥皂", 12.45f, 2));
	pdts.add(new Product("2", "香皂", 12.45f, 3));
	pdts.add(new Product("3", "洗衣粉", 12.45f, 1));
	
for(Product p:pdts) {
	System.out.println(p.getProductName());
}

Map集合中三种方法的简介:

values():获取集合中的所有的value值;

keySet():将Map中所有的key存放到Set集合中。应为Set集合有迭代器,可以通过迭代器循环key,在通过get()方法,得到每个key所对应的value;

entrySet():Set<Map.Entry<K,V>> entrySet() //返回此映射中包含的映射关系的 Set 视图。 Map.Entry表示映射关系。entrySet():迭代后可以e.getKey(),e.getValue()取key和value。返回的是Entry接口 。

/**通过values()方法,获取集合中所有的值**/
	Collection<String> collection = map.values();
	System.out.println(collection);
	
	/**通过keySet()方法将所有的key值存放到Set集合中,Set集合中有迭代器**/
	  Set<String> keySet = map.keySet();//先获取map集合的所有键的Set集合
	Iterator<String> iterator = keySet.iterator();
	while(iterator.hasNext()){
		String key = iterator.next();
		System.out.println("key="+key+"  "+map.get(key));
	}
	
	/**通过entrySet()方法将key和value存放到Set集合中,Set集合中有迭代器**/
	Set<Entry<String,String>> entry = map.entrySet();
	Iterator<Entry<String,String>> iterators = entry.iterator();
	while(iterators.hasNext()){
		Entry<String,String> entrys  = iterators.next();
		System.out.println("key="+entrys.getKey()+"&&value="+entrys.getValue());
		
		/**通过entrySet()方法将key和value存放到Set集合中,用for增强循环**/
			Set<Entry<String,String>> entry = map.entrySet();
			for (Entry x:entry){			
			System.out.println("key="+x.getKey()+"&&value="+x.getValue());
			}

HashMap的应用:找出重名的商品

package cn.edu360.javase24.day06.hashmapdemo;

import java.util.Collection;
import java.util.HashMap;
import java.util.Set;

import cn.edu360.javase24.day05.shop.Product;

/**
 * hashmap的应用练习2:
 * 
 * @author ThinkPad
 *
 */
public class HashMapTest2 {

	public static void main(String[] args) {

		// 1、造几个product对象,放入一个hashmap中
		Product p1 = new Product("1", "香蕉", 20, 2);
		Product p2 = new Product("2", "橘子", 10, 2);
		Product p3 = new Product("3", "榴莲", 120, 2);
		Product p4 = new Product("4", "香蕉", 20, 2);
		Product p5 = new Product("5", "榴莲", 120, 2);
		Product p6 = new Product("6", "榴莲", 120, 2);

		HashMap<String, Product> pdtMap = new HashMap<>();
		pdtMap.put(p1.getProductId(), p1);
		pdtMap.put(p2.getProductId(), p2);
		pdtMap.put(p3.getProductId(), p3);
		pdtMap.put(p4.getProductId(), p4);
		pdtMap.put(p5.getProductId(), p5);
		pdtMap.put(p6.getProductId(), p6);

		// 2、给我找出hashmap中产品名称重复的数据,并打印出发生了重复的数据产品id:

		// 遍历pdtMap,逐一取出里面的product对象,然后构造一个新的hashmap
		// 然后判断,这个product对象的name在新hashmap是否存在,如果尚不存在,则将这个product对象的name作为key,id作为value放入一个新的hashmap中
		// 如果已存在,则将之前的id拼上这个product的id作为value覆盖进去

		HashMap<String, String> newMap = new HashMap<>();

		Set<String> keySet = pdtMap.keySet();
		for (String id : keySet) {
			Product p = pdtMap.get(id);
			if (newMap.containsKey(p.getProductName())) {
				String id_value = newMap.get(p.getProductName()); // 从新map中取出已存在的产品id
				newMap.put(p.getProductName(), id_value + "," + p.getProductId()); // 将新map中的产品id拼上这次从老map中取出的产品的id
			} else {

				newMap.put(p.getProductName(), p.getProductId());
			}
		}

		Set<String> keySet2 = newMap.keySet();
		for (String name : keySet2) {
			String ids = newMap.get(name);
			System.out.println(ids + "-->" + name);

		}

		// 1,4-->香蕉
		// 3,5,6-->榴莲

	}

}

应用二:找出相同的字母

首先将单词HashMap安排中,存入的方式是这样,将单词依次存入,这里字母为key,数量为value,如果key不存在该单词,便将其存入且数量设为1,如果存在,则数量+1

package hashmapdemo;

import java.util.HashMap;
import java.util.Set;

public class WordCount {public static void main(String[] args) {
	String str = "a,b,c,d,e,f,g,h,b,b,b,c,x,x,y,x,b";
	String[] words = str.split(",");
	
	HashMap<String, Integer> countMap = new HashMap<>();
	
	for(String ch:words) {
		if(countMap.containsKey(ch)) {
			Integer value = countMap.get(ch);
			countMap.put(ch, value+1);
		}else {
			countMap.put(ch, 1);
		}
	}
	
	/**
	 * 遍历hashmap,打印数据
	 */
	// 先取出所有的key
	Set<String> keySet = countMap.keySet();
	// 然后遍历一个一个的key,去map中取value
	for(String key:keySet) {
		Integer count = countMap.get(key);
		System.out.println(key + "," + count);
		
	}
}

}

发布了44 篇原创文章 · 获赞 0 · 访问量 878

猜你喜欢

转载自blog.csdn.net/heartless_killer/article/details/97538744