2015-11-06 10 views
-5

Я просматриваю HTML-страницу с помощью jsoup и извлекаю ссылки и текст, соответствующие этим ссылкам.Избегайте дублирования элементов в результатах

Я сохраняю ссылку как значение и текст как ключ на карте. По умолчанию Карта не должна позволять мне вводить повторяющиеся элементы, но здесь Я получаю повторяющиеся элементы в результате.

Может ли кто-нибудь помочь мне с решением? Вот мой код.

public class ParseHtmlStrInHashMap { 
public static String linkText; 
public static String linkHref; 
public static int i = 1; 

public static Map<Set<String>, Set<String>> pageURLsAndText(Set<String> linkText, Set<String> linkHref) { 

    Map<Set<String>, Set<String>> map = new HashMap<Set<String>, Set<String>>(); 
    map.put(linkText, linkHref); 
    return map; 

    /*for(Map.Entry<String, String> entry : map.entrySet()) { 
     System.out.println("Key = "+entry.getKey()+", value = "+entry.getValue()); 
    }*/ 
} 

public static void main(String[] args) { 

    //ParseHtmlStrInHashMap phtml = new ParseHtmlStrInHashMap(); 

    Document doc = null; 
    try { 
    doc = Jsoup.connect("URL").get(); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } 

    Elements links = doc.select("a[href]"); 
    for (Element link : links) { 
    linkHref = link.attr("abs:href"); 
    linkText = link.text(); 

    if(linkText.isEmpty()) { 
     /*linkText = "Amazon"+i; 
     i++;*/ 

     if(linkHref.contains("=")) { 
     String arr[] = linkHref.split("="); 
     int j = arr.length-1; 
     linkText = arr[j]; 
     } 
     else { 
     String arr[] = linkHref.split("/"); 
     int j = arr.length-1; 
     linkText = arr[j]; 
     } 

    } 

    Set<String> setHref = new HashSet<String>(); 
    Set<String> setText = new HashSet<String>(); 
    setHref.add(linkHref); 
    //setText.add(linkText); 

    if(setText.contains(linkText)) { 
     linkText = linkText.concat(String.valueOf(i)); 
     i++; 
     setText.add(linkText); 
    } 
    else { 
     setText.add(linkText); 
    } 
    //System.out.println("Text = "+linkText+", URL = "+linkHref); 
    Map<Set<String>, Set<String>> map = pageURLsAndText(setText, setHref); 

    for(Map.Entry<Set<String>, Set<String>> entry : map.entrySet()) { 
    System.out.println("Key = "+entry.getKey()+", value = "+entry.getValue()); 
    } 
} 
} 
+4

Было бы полезно, чтобы [сократить образец кода и показать входные и ожидаемые результаты] (http://stackoverflow.com/help/mcve). – yasd

ответ

-1

Похоже, вы пытаетесь сохранить строки, являющиеся ключом, в вашей HashMap. Тем не менее, ваш HashMap не настроен на сохранение строк.

Изменить HashMap из

Map<Set<String>, Set<String>> map = new HashMap<Set<String>, Set<String>>(); 

в

Map<String, String> map = new HashMap<String, String>(); 

Это будет исправить вашу проблему

+0

Привет, Кабир, Спасибо за ваш ответ. Я попробовал так, как сказал мне, но даже это дало мне дубликаты ключей. Просто попробуй с амазоном в качестве URL-адреса. –

Смежные вопросы