# HG changeset patch # User Andrew@edwin8 # Date 1653503087 14400 # Wed May 25 14:24:47 2022 -0400 # Node ID 660b060ed3e598879ce235a356ad5e6f65a997be # Parent 9504b94630a7e4c35deac975ae9b63f52bfc8836 Collect and average the reviews. Sort by average review. Becomes kinda useful at this point. diff --git a/src/main/java/com/ajtjp/trailaggregator/Main.java b/src/main/java/com/ajtjp/trailaggregator/Main.java --- a/src/main/java/com/ajtjp/trailaggregator/Main.java +++ b/src/main/java/com/ajtjp/trailaggregator/Main.java @@ -21,7 +21,7 @@ public class Main { public static void main(String[] args) { try { - Document ohio = Jsoup.connect("https://www.traillink.com/state/oh-trails/").get(); + Document ohio = Jsoup.connect("https://www.traillink.com/state/wv-trails/").get(); Elements trailResults = ohio.select(".search-result-card"); Object longTrails = trailResults.stream().filter(new LengthFilter()).filter(new TrailConglomerationFilter()).collect(Collectors.toList()); @@ -43,21 +43,54 @@ } }); + + System.out.println("There are " + longTrailList.size() + " long trails in West Virginia"); + List trails = new ArrayList<>(); longTrailList.iterator().forEachRemaining((elementTrail) -> { String name = elementTrail.selectFirst(".info h3").text(); float length = Float.parseFloat(elementTrail.selectFirst(".length").text().split(" ")[0]); float initialRating = elementTrail.select(".rating i").size(); + String href = elementTrail.selectFirst(".info a").attr("href"); - Trail trail = new Trail(name, length, initialRating); + Trail trail = new Trail(name, length, initialRating, href); trails.add(trail); + + //Now let's get even more data + String fullURL = "https://www.traillink.com" + href; + try { + Document details = Jsoup.connect(fullURL).get(); + Elements ratedReviews = details.select(".review .stars [itemprop='ratingValue']"); + trail.setReviewCount(ratedReviews.size()); + float totalScore = 0; + for (Element review : ratedReviews) { + int rating = Integer.parseInt(review.attr("content")); + totalScore += rating; + } + float averageScore = totalScore / ratedReviews.size(); + trail.setRating(averageScore * 2); + System.out.print("."); + } + catch(IOException ex) { + System.err.println("Could not get details for " + name + " at " + fullURL); + } + }); + System.out.println(); + + trails.sort(new Comparator(){ + @Override + public int compare(Object o1, Object o2) { + Trail one = (Trail)o1; + Trail two = (Trail)o2; + return one.getRating() < two.getRating() ? 1 : -1; + } }); - System.out.println("There are " + trails.size() + " long trails in Ohio"); for (Trail trail : trails) { - System.out.println(" " + trail.getName() + " (" + trail.getLength() + " miles), " + trail.getRating()); + System.out.println(" " + trail.getName() + " (" + trail.getLength() + " miles), " + trail.getFormattedRating() + " [" + trail.getReviewCount() + "]"); } + } catch (IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } diff --git a/src/main/java/com/ajtjp/trailaggregator/Trail.java b/src/main/java/com/ajtjp/trailaggregator/Trail.java --- a/src/main/java/com/ajtjp/trailaggregator/Trail.java +++ b/src/main/java/com/ajtjp/trailaggregator/Trail.java @@ -1,6 +1,8 @@ package com.ajtjp.trailaggregator; +import java.util.Formatter; + /** * Represents a Trail, and its various attributes. * @author Andrew @@ -9,11 +11,14 @@ private String name; private float length; private float rating; + private int reviewCount; + private String href; - public Trail(String name, float length, float rating) { + public Trail(String name, float length, float rating, String href) { this.name = name; this.length = length; this.rating = rating; + this.href = href; } public String getName() { @@ -35,8 +40,28 @@ public float getRating() { return rating; } + + public String getFormattedRating() { + return String.format("%.2f", rating); + } public void setRating(float rating) { this.rating = rating; } + + public String getHref() { + return href; + } + + public void setHref(String href) { + this.href = href; + } + + public int getReviewCount() { + return reviewCount; + } + + public void setReviewCount(int reviewCount) { + this.reviewCount = reviewCount; + } }