簡體   English   中英

從Java中的HashMap獲取數組元素

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

由於每個對象都有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()

不過,我們可以使用此代碼清理很多事情。

  • 避免混合泛型和數組(有效Java項目25); 數組缺少泛型安全性提供的類型,因此很少有充分的理由在現代泛型代碼中使用它們。 更好的類型簽名是HashMap<String, List<Object>> 這實際上是相同的,但實際上更容易使用。
  • 不要使用數組來存儲不同的類型。 您似乎正在將"Test"字符串,標識符字符串,元素的文本以及文本的長度存儲為數組中的字段。 這就是對象的用途 用這四個字段定義一個對象,然后將它們傳遞給構造函數。 更好的是,由於除i所有內容都可以從該元素計算得出,因此只需將該元素傳遞到構造函數中,並在構造函數甚至類的getter中計算所需的信息(HTML字符串,長度等)。
  • 不要對IteratorMap.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM