[英]Get array elements from HashMap in Java
我有一个方法将值放入HashMap HashMap<String, Object[]>
类型的HashMap<String, Object[]>
并返回相同的HashMap。
将值放入HashMap的代码:
doc = Jsoup.connect(url).get();
for( org.jsoup.nodes.Element element : doc.getAllElements() )
{
for( Attribute attribute : element.attributes() )
{
String option_ID=element.tagName()+"_"+attribute.getKey()+"_"+attribute.getValue();
String HTMLText=element.text();
int HTMLTextSize=HTMLText.length();
if(!HTMLText.isEmpty())
data.put("Test"+i,new Object[{"Test"+i,option_ID,HTMLText,HTMLTextSize});//adding value in HashMap.
i++;
}
}
我尝试如下迭代,我认为这不是正确的方法:
HashMap<String, Object[]>set=HTMLDocument.createHTMLSet("URL of website");
Iterator it = set.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
System.out.println(pair.getKey() + " = " + pair.getValue());
}
当我得到的输出为:
Test79 = [Ljava.lang.Object; @ 14e1a0f
Test378 = [Ljava.lang.Object; @ 1a5f880
我应该如何遍历此HashMap以获得Object []值,例如option_ID , HTMLText ?
由于每个对象都有toString()
方法,因此默认显示类名表示形式,然后添加@
符号,然后添加哈希码,这就是为什么要获取输出的原因
[Ljava.lang.Object;@14e1a0f
这意味着该数组包含一个类或接口 。
一种解决方案是在数组上循环并打印每个部分(或使用Arrays.toString
方法),但是我强烈建议您将其包装到自己的类中并覆盖toString
方法。
以下代码可能会有所帮助。 创建一个由必需信息组成的Bean类总是更好,该类将存储在对象数组中。
package stack.overflow;
import java.util.HashMap;
import java.util.Map;
public class RetrieveMap {
public static void main(String[] args) {
Person p = new Person();
p.setName("John");
p.setEmpNo("1223");
p.setAge("34");
Person p1 = new Person();
p1.setName("Paul");
p1.setEmpNo("1224");
p1.setAge("35");
Person[] arr = new Person[2];
arr[0] = p ;
arr[1] = p1;
HashMap<String,Person[]> map = new HashMap<String,Person[]>();
map.put("a1", arr);
for(Map.Entry<String, Person[]> entry : map.entrySet()) {
System.out.println("Key:" +entry.getKey());
System.out.println("Value:" +entry.getValue());
for(int i=0;i<entry.getValue().length;i++) {
System.out.println("------------------");
System.out.println("Array:"+i);
Person r1 = (Person)entry.getValue()[i];
System.out.println("Name:" +r1.getName());
System.out.println("Age:" + r1.getAge());
System.out.println("Emp no:" + r1.getEmpNo());
System.out.println("------------------");
}
}
}
}
package stack.overflow;
public class Person {
String name;
String age;
String empNo;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getEmpNo() {
return empNo;
}
public void setEmpNo(String empNo) {
this.empNo = empNo;
}
}
简短的答案是您的代码行为完全正确。 当您在Object[]
上调用.toString()
时(与System.out.println()
隐式发生),您会得到奇怪的[<TYPE>@<IDENTIFIER>
字符串。 要打印数组的内容 ,请使用Arrays.toString()
。
不过,我们可以使用此代码清理很多事情。
HashMap<String, List<Object>>
。 这实际上是相同的,但实际上更容易使用。 "Test"
字符串,标识符字符串,元素的文本以及文本的长度存储为数组中的字段。 这就是对象的用途 。 用这四个字段定义一个对象,然后将它们传递给构造函数。 更好的是,由于除i
所有内容都可以从该元素计算得出,因此只需将该元素传递到构造函数中,并在构造函数甚至类的getter中计算所需的信息(HTML字符串,长度等)。 Iterator
和Map.Entry
使用原始类型(有效Java项目23)。 使用原始类型时,IDE会警告您,这样可以避免这种常见的编程错误。 在您的代码中,应该使用Iterator<Entry<String, Object[]>>
和Entry<String, Object[]>
不要使用Iterator
来遍历Map
的元素,而应使用for-each循环:
for (Entry<String, ...> e : map.entrySet()) { ... }
Map
变量称为set
; 他们是不同的东西。 类似地, Map.Entry
不是一pair
-它专门表示键值关系。 这是代码的清理版本,假设存在一个Container
对象,该对象采用Element
并提取所需的数据。
doc = Jsoup.connect(url).get();
for (org.jsoup.nodes.Element element : doc.getAllElements()) {
for (Attribute attribute : element.attributes()) {
Container c = new Container(i++, attribute);
data.put(c.getKey(), c);
}
}
和:
HashMap<String, Container> map = HTMLDocument.createHTMLMap("URL of website");
for (Entry<String, Container> e : map.entrySet()) {
System.out.println(e.getKey() + " = " + e.getValue());
}
该值是Object的数组。 尝试改为关注
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
System.out.println(pair.getKey() + " = " + pair.getValue()[0].toString());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.