[英]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.