请问Java中Map集合如何使用?key值和value值如何用?请说的详细一点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问Java中Map集合如何使用?key值和value值如何用?请说的详细一点相关的知识,希望对你有一定的参考价值。

Map是成对放的,一放一对。。分成KEY和VALUE
Map分为HashMap或Hashtable、LinkedHashMap和TreeMap几个,
其中HashMap是新版的,线程不安全的,Hashtable是线程安全的。

Map是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射。对于键对象来说,像Set一样,一个Map容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对象一样,那你想得到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,结果会造成混乱,所以键的唯一性很重要,也是符合集合的性质的。当然在使用过程中,某个键所对应的值对象可能会发生变化,这时会按照最后一次修改的值对象与键对应。对于值对象则没有唯一性的要求。你可以将任意多个键都映射到一个值对象上,这不会发生任何问题(不过对你的使用却可能会造成不便,你不知道你得到的到底是那一个键所对应的值对象)。Map有两种比较常用的实现:HashMap和TreeMap。HashMap也用到了哈希码的算法,以便快速查找一个键,TreeMap则是对键按序存放,因此它便有一些扩展的方法,比如firstKey(),lastKey()等,你还可以从TreeMap中指定一个范围以取得其子Map。键和值的关联很简单,用put(Object key,Object value)方法即可将一个键与一个值对象相关联。用get(Object key)可得到与此key对象所对应的值对象。

import java.util.*;
class HashMapDemo
public static void main(String args[])
// Create a hash map
HashMap hm = new HashMap();
// Put elements to the map
hm.put("John Doe", new Double(3434.34));
hm.put("Tom Smith", new Double(123.22));
hm.put("Jane Baker", new Double(1378.00));
hm.put("Todd Hall", new Double(99.22));
hm.put("Ralph Smith", new Double(-19.08));
// Get a set of the entries
Set set = hm.entrySet();
// Get an iterator
Iterator i = set.iterator();
// Display elements
while(i.hasNext())
Map.Entry me = (Map.Entry)i.next();
System.out.print(me.getKey() + ": ");
System.out.println(me.getValue());


由Map.Entry定义的getKey( )和getValue( )方法而显示。程序开始创建一个散列映射,然后将名字的映射增加到平衡表中。接下来,映射的内容通过使用由调用函数entrySet( )而获得的集合“视图”而显示出来。关键字和值通过调用追问

声明map时需要key和value,他们两个如何给,给什么类型的

追答

声明时的key和value看你需要而定,可以两个都是String、object或者一个是int一个是String等等。这个看你对key和value值需要的类型了。

参考技术A 这个不用要的那么详细,对于应用来说,比如举个例子:
Map map = new HashMap();
map.put("key","value");
这样就存入了一对值,你可以理解key就是所对应的名字,而value就是值。
map存值就类似于你往一个瓶子中放东西,而key就是标签,value就是其中放的东西,而取值的时候就相当于取东西,你要知道所要取的东西的标签才可以取东西,也就是map.get("key")。
参考技术B import java.util.HashMap;
class maptext
public static void main(String[] args)

HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put(100,"tom");
System.out.println(map);

运行结果是100=tom,就是这样,

如何将 .map() val 和 key 作为 setState 回调之外的道具呈现

【中文标题】如何将 .map() val 和 key 作为 setState 回调之外的道具呈现【英文标题】:How to render .map() val and key as a prop outside of setState callback 【发布时间】:2019-09-22 01:32:01 【问题描述】:

我有这个组件,它执行 post request 并映射我得到的 json 数据作为回报。在此响应中,我执行setState 并在回调中映射数据。我这样做是因为 setState 的异步特性。

我希望能够在render() 的范围之外使用valkey,但我不确定如何实现。

加载卡:

class LoadCard extends Component 
  constructor(props) 
    super(props);
    this.state = 
      req: [],
    
  

  componentDidMount() 
    axios.post(hostname, 
      request: "?request=getObjects"
    )
      .then(response => 
        this.setState(
          req: JSON.parse(response.data)
        ,
          () => this.state.req.objects.map((val, key) => 
            // after mapping what to do here?
          )
        );
      )
      .catch(error => 
        console.log("Error: Card/componentDidMount: " + error);
      );
  

  render() 
    return (
      <Card key=key title=val.name /> /* use val and key here */
    );
  

在组件的渲染中,我希望能够使用valkey 作为Card 组件的道具。

卡片:

class Card extends Component 
  render() 
    return (
      <View key=this.props.key>
        <Text>this.props.title</Text>
      </View>
    );
  

编辑以适合评论问题:

我得到的响应数据是这样的:


    "objects": [
        
            "zone_id_1": 151,
            "zone_id_2": null,
            "blocked": "Y",
            "type_id": 1,
            "name": "Alarm chauffeurs@ON=100",
            "output_value": 0,
            "object_id": 1,
            "input_value": 100,
            "last_changed": "2019-04-04T11:36:53",
            "continuously_high_enabled": "N"
        ,
        
            "zone_id_1": 150,
            "zone_id_2": null,
            "blocked": "N",
            "type_id": 1,
            "name": "Alarm office@ON=0",
            "output_value": 0,
            "object_id": 2,
            "input_value": 0,
            "last_changed": "2019-03-26T15:52:01",
            "continuously_high_enabled": "N"
        ,

    ]

【问题讨论】:

【参考方案1】:

你应该在你的渲染函数中运行它,这将在你的 setState 完成后触发。

您的状态应该处理前数据,并且在获取数据后具有相同的结构。或者在 render 方法中做 if 验证来检查值是否存在,但那是浪费几行代码。

默认状态:data: [] // 初始化状态 - 数组 on setState(data: req.objects) // 在你的 axios 响应中 - 数组 价值观

你的渲染应该可以访问它

  render() 
      const  data  = this.state;
      const Cards = data.map((title, key) => 
          return <Card key=key title=title />
      )
    
      return(
         <View>
           Cards
         </View>
      )
    

由于您在渲染函数中使用“req”状态,它会随着状态中的 req 值的更新而自动更新。

React 是一个非常强大的工具,我认为每个人都应该阅读它的工作原理以及它为什么会这样工作。

【讨论】:

我已经尝试过这种方式,但出现错误"TypeError: Undefined is not an object (evaluating 'this.state.req.objects.map') 在控制台中记录this.state.req首先会打印一个空数组:05-03 15:55:32.400 5483 7757 I ReactNativeJS: [],然后是另一个设置状态成功的日志 这让我相信我试图映射一个空状态并且不得不通过回调中的映射等待状态完成。 是的,刚刚看到你的状态,你应该真正设置你的状态在开始时有一些默认的空数组值,例如req:objects:[],这样代码就不会出现意外错误。你会得到未定义的错误,因为起初 req 是数组,并且找不到关键的“对象”:) 我刚刚看到你的更新回复,我会试试谢谢。【参考方案2】:

我认为您在这里误解了setState 的行为。 不要在setState 回调中映射this.state.req.objects

改为:

class Card extends Component 
  render() 
    return this.state.req.objects.map((val, key) => (
      <View key=key>
        <Text>val.title</Text>
      </View>
    ));
  

显然,请确保您的状态已正确初始化。例如,将objects: [] 添加到req

【讨论】:

以上是关于请问Java中Map集合如何使用?key值和value值如何用?请说的详细一点的主要内容,如果未能解决你的问题,请参考以下文章

Java Map遍历方式的选择

java中如何在map中实现一对多的关系?

java map集合赋值 key值相同覆盖问题

JAVA里map的key值和value值怎么放到SQL文里作条件

集合的存与取3

java中如何通过Map的key获得它的value?