Archief - JAVA - ArrayList duplicates uithalen via overriden equals functie

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

GizeH

Legacy Member
Via onderstaande code haal ik de links op van de url "https://nl.wikipedia.org/w/index.php?search=basketball" op wikipedia.

Deze links worden in een arraylist opgeslagen, maar het probleem is dat ik de dubbele elementen er niet kan uitfilteren.
Ik gebruiken ArrayList.contains, en in mijn Link klasse override ik dan de equals functie, waarin ik controleer op de element.ownText() (jsoup eigenschap om de linktitel op te halen.

Iemand een idee wat het probleem zou kunnen zijn?

Code:
import java.util.*;
import org.jsoup.*;

String url = "https://nl.wikipedia.org/w/index.php?search=basketball";
//String[] allLinks = new String[0];

ArrayList get_links() {
    try {
      Document doc = Jsoup.connect(url).get();
      /*
      String str = loadStrings("index.html")[0];
      Document doc = Jsoup.parse(str); 
      print(doc.title());
      */
      
      Element content = doc.getElementById("bodyContent");
      
      Elements lks = content.select("a[href^=/wiki/]");
 
      ArrayList<Link> links = new ArrayList<Link>();
      for(Element el: lks) {
        Link link = new Link(el);
        if (link.element.hasText()) {         
          if (!links.contains(link)) {
            links.add(link);
          }
        }
      }
      
      return links;
    } catch(Exception ex) {
    }
    
    return null;
}

void print_links(ArrayList links) {
  Collections.sort(links, new MyComparator());
  Iterator<Link> it = links.iterator();
  
  while (it.hasNext()) {
      Link link = it.next();
      Element el = link.element;
      println(el.ownText());
    }
}


void setup() {  
    ArrayList links = get_links();    
    print_links(links); 
}

class Link {
  Element element;
  
  Link(Element el) {
    element = el;
  }
  
  @Override
  public boolean equals(Object obj) {
    if (obj instanceof Link) {
      Link link = (Link) obj;
      if (link.element.ownText() == this.element.ownText()) {
        return true;
      }
    }
    return false;
  }
}

class MyComparator implements Comparator<Link> {
  @Override
  public int compare(Link l1, Link l2) {
    return l1.element.ownText().compareToIgnoreCase(l2.element.ownText());
  }
}

NoGo

Legacy Member
GizeH zei:
Via onderstaande code haal ik de links op van de url "https://nl.wikipedia.org/w/index.php?search=basketball" op wikipedia.

Deze links worden in een arraylist opgeslagen, maar het probleem is dat ik de dubbele elementen er niet kan uitfilteren.
Ik gebruiken ArrayList.contains, en in mijn Link klasse override ik dan de equals functie, waarin ik controleer op de element.ownText() (jsoup eigenschap om de linktitel op te halen.

Iemand een idee wat het probleem zou kunnen zijn?

Code:
import java.util.*;
import org.jsoup.*;

String url = "https://nl.wikipedia.org/w/index.php?search=basketball";
//String[] allLinks = new String[0];

ArrayList get_links() {
    try {
      Document doc = Jsoup.connect(url).get();
      /*
      String str = loadStrings("index.html")[0];
      Document doc = Jsoup.parse(str); 
      print(doc.title());
      */
      
      Element content = doc.getElementById("bodyContent");
      
      Elements lks = content.select("a[href^=/wiki/]");
 
      ArrayList<Link> links = new ArrayList<Link>();
      for(Element el: lks) {
        Link link = new Link(el);
        if (link.element.hasText()) {         
          if (!links.contains(link)) {
            links.add(link);
          }
        }
      }
      
      return links;
    } catch(Exception ex) {
    }
    
    return null;
}

void print_links(ArrayList links) {
  Collections.sort(links, new MyComparator());
  Iterator<Link> it = links.iterator();
  
  while (it.hasNext()) {
      Link link = it.next();
      Element el = link.element;
      println(el.ownText());
    }
}


void setup() {  
    ArrayList links = get_links();    
    print_links(links); 
}

class Link {
  Element element;
  
  Link(Element el) {
    element = el;
  }
  
  @Override
  public boolean equals(Object obj) {
    if (obj instanceof Link) {
      Link link = (Link) obj;
      if (link.element.ownText() == this.element.ownText()) {
        return true;
      }
    }
    return false;
  }
}

class MyComparator implements Comparator<Link> {
  @Override
  public int compare(Link l1, Link l2) {
    return l1.element.ownText().compareToIgnoreCase(l2.element.ownText());
  }
}

In je equals methode vergelijk je Strings met ==, dit is een reference comparison. D.w.z. dat het enkel waar is indien beiden hetzelfde object zijn. Vervang het door a.equals(b), dan gebruik je de String.equals implementatie, dewelke op content vergelijkt. Een natuurlijkere manier om het in dit geval op te lossen is het gebruik maken van een Set i.p.v. een List.

Dat terzijde, er is wel wat meer mis met je code :unsure:

GizeH

Legacy Member
Bedankt, wat is er dan nog mis mee? Dit gaat om een processing sketch btw

Verstuurd vanaf mijn Nexus 4 met Tapatalk

NoGo

Legacy Member
GizeH zei:
Bedankt, wat is er dan nog mis mee? Dit gaat om een processing sketch btw

Verstuurd vanaf mijn Nexus 4 met Tapatalk

Nooit mee gewerkt, dit is dus (deels) generated code?

GizeH

Legacy Member
NoGo zei:
Ah :cool: Python programmer? :)
Voor processing net met java begonnen, heb wel wat kennis van python ook. Vanwaar de vraag eigenlijk want hier staat toch nergens python code in dit topic? ;)

Verstuurd vanaf mijn Nexus 4 met Tapatalk

NoGo

Legacy Member
GizeH zei:
Voor processing net met java begonnen, heb wel wat kennis van python ook. Vanwaar de vraag eigenlijk want hier staat toch nergens python code in dit topic? ;)

Verstuurd vanaf mijn Nexus 4 met Tapatalk

Oh, geen reden, ik zag die underscore en werd getriggered :p

Timmos

Legacy Member
Als je equals() override, dan moet je ook hashCode() overriden met een implementatie gebaseerd op equals(). Anders gaat je klasse niet naar behoren werken in andere datastructuren zoals Maps.

De twee methodes gaan hand in hand.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan