如何从 ArrayList<Hashtable<String, ArrayList<String>>> 获取值

Posted

技术标签:

【中文标题】如何从 ArrayList<Hashtable<String, ArrayList<String>>> 获取值【英文标题】:how to get values from an ArrayList<Hashtable<String, ArrayList<String>>> 【发布时间】:2016-08-23 10:58:56 【问题描述】:

我有一个函数可以从多个文件中读取数据,结构如下:

id  date    temp    psal
1   2016/02/01  37.6    35.9
2   2016/02/02  30.3    35.7
3   2016/02/03  28.2    36.8
4   2016/02/04  27.7    37.7
5   2016/02/05  28.7    37.9
6   2016/02/06  28.7    37.9

函数是:

ArrayList<Hashtable<String, ArrayList<String>>> processedFilesArray = ReadFiles(files);

如果我尝试使用例如检索数据:

System.out.println(processedFilesArray.get(0));

然后我得到以下响应:

Psals=[35.9, 35.7, 36.8, 37.7, 37.9, 37.9], Temps=[37.6, 30.3, 28.2, 27.7, 28.7, 28.7], ids=[1, 2, 3, 4, 5, 6], DateStrings=[2016/02/01, 2016/02/02, 2016/02/03, 2016/02/04, 2016/02/05, 2016/02/06]

我的问题是: 如何使用 jfreechart 单独获取键的不同值(Temps、Psals、ids 等)以绘制它们?

提前致谢

【问题讨论】:

您自己构建了ArrayList&lt;Hashtable&lt;String, ArrayList&lt;String&gt;&gt;&gt; 吗?如果是这样,那就是错误的数据结构(实际上是“并行数组”结构)。你应该定义一个类来保存一行输入作为一个对象。 正如@JimGarrison 所说,您应该重新考虑您的数据结构。 您好,感谢大家的快速回复。实际上,我并没有完全自己建造这个结构。但是,我了解您关于创建类的 cmets,这可能是我的下一步,因为我目前正在学习对象哲学 【参考方案1】:

您可以通过这种方式获取键和值:

//Each hastTable of proccesedFilesArray
     for(Hashtable<String,ArrayList<String>> processedFile : processedFilesArray)
        //Each entrySet of proccesedFile
        for(Entry<String, ArrayList<String>> entry : processedFile.entrySet())
            //Filter here by key or value with if conditions
            String key = entry.getKey();
            ArrayList<String> listValue = entry.getValue();//List of Strings
            for(String value : listValue)
               //each value per hashtable key
            

        
    

我真的不知道你想如何使用它,但这可能是一种迭代你的列表并获取每条记录的值的方法。

【讨论】:

【参考方案2】:

您可以通过方法keySet() 获取哈希表中的键列表,该方法返回键集。

您可以像这样将 Set 转换为 Array 列表:-

ArrayList keyList = new ArrayList(processedFilesArray.get(0).keySet());

更多关于keySethttp://www.tutorialspoint.com/java/util/hashmap_keyset.htm

【讨论】:

感谢您的回复 Hitesh。我通过使用值而不是 keySet 来解决它。但是,为了获得价值,您的回复对我很有用。【参考方案3】:

我终于在 Hitesh 回复后解决了这个问题,方法是:

ArrayList keyList = new ArrayList(processedFilesArray.get(1).values());
    System.out.println(keyList.get(0));

这会返回我读取的第二个文件中的第一组(诗篇):

    [35.9, 35.7, 36.8, 37.7, 37.9, 37.9]

谢谢大家的帮助!!

【讨论】:

这是非常脆弱的,因为在 Hashtable 中不能保证顺序。与其通过将Hashtable.values() 返回的集合复制到ArrayList 中并按索引访问这些值来访问值列表,不如以这种方式访问​​它:processedFilesArray.get(i).get("Psals")。理想情况下,如果您想处理 Hashtable 中的所有元素,您应该使用 Manu AG 的答案。 感谢 Valentin,它比我的解决方案效果更好。对于 Manu AG 的解决方案,我也同意你的看法。

以上是关于如何从 ArrayList<Hashtable<String, ArrayList<String>>> 获取值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 List<> 转换 ArrayList<>

如何从 ArrayList<Double> 转换为 double[] [重复]

如何从arraylist中获取其中的一个元素

如何从 ArrayList<String> 转换为 double[]? [复制]

如何从另一个类中的 ArrayList <List> 获取数据?

如何从 HashMap 中提取 ArrayList 并在 Java 中循环遍历它?