DulcetAirman icon

group by in Java

DulcetAirman | PRO | 08/13/18 07:49:52 PM UTC | 0 ⭐ | 687 👁️ | Never ⏰ | []
Java |

3.38 KB

|

None

|

0 👍

/

0 👎

package ch.claude_martin;
 
import java.security.SecureRandom;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.stream.Collectors;
 
public class SomeClass {
 
  /** This is the data bean. It's a plain old java object. */
  public static class Bike {
 
    private String modelName;
    private LocalDate purchaseDate;
    private String contact;
    private int price;
 
    public String getModelName() {
      return modelName;
    }
 
    public void setModelName(String modelName) {
      this.modelName = modelName;
    }
 
    public LocalDate getPurchaseDate() {
      return purchaseDate;
    }
 
    public void setPurchaseDate(LocalDate purchaseDate) {
      this.purchaseDate = purchaseDate;
    }
 
    public String getContact() {
      return contact;
    }
 
    public void setContact(String contact) {
      this.contact = contact;
    }
 
    public int getPrice() {
      return price;
    }
 
    public void setPrice(int price) {
      this.price = price;
    }
 
    @Override
    public String toString() {
      return String.format("Bike(%s, %s, %d, %s)", modelName, purchaseDate, price, contact);
    }
  }
 
  /**
   * This is just a simple pair, but Java doesn't have a type for this. You could
   * use Map.Entry for this. For a group over 3 fields you need a three-tuple
   * instead.
   */
  public static class Pair<A, B> {
    private A a;
    private B b;
 
    public Pair(A a, B b) {
      super();
      this.a = a;
      this.b = b;
    }
 
    @Override
    public int hashCode() {
      return a.hashCode() + b.hashCode() * 31;
    }
 
    @Override
    public boolean equals(Object obj) {
      if (this == obj)
        return true;
      if (obj == null || getClass() != obj.getClass())
        return false;
      Pair other = (Pair) obj;
      return this.a.equals(other.a) && this.b.equals(other.b);
    }
 
    @Override
    public String toString() {
      return String.format("Group(%s, %s)", a, b);
    }
  }
 
  public static void main(String[] args) {
    final List<Bike> bikes = new ArrayList<>();
    final List<String> contacts = List.of("Bob", "Jill", "Jack", "Susie", "Burt", "Emma");
    final Random rng = new SecureRandom();
    for (int month = 1; month < 13; month++) {
      for (int day = 1; day < 29; day++) {
        for (int i = 0; i < rng.nextInt(4); i++) {
          for (String contact : contacts) {
            Bike b = new Bike();
            b.setContact(contact);
            b.setPurchaseDate(LocalDate.of(2018, month, day));
            b.setPrice(rng.nextInt(5000) + 500);
            b.setModelName(Long.toString(Math.abs(rng.nextLong() % 3656158440062976L), 36));
            bikes.add(b);
          }
        }
      }
    }
    System.out.println("Database is ready");
 
    Map<Pair<String, LocalDate>, List<Bike>> groups = bikes.stream()
        .collect(Collectors.groupingBy(b -> new Pair<>(b.getContact(), b.getPurchaseDate())));
 
    for (Entry<Pair<String, LocalDate>, List<Bike>> entry : groups.entrySet()) {
      System.out.println("=====");
      System.out.print(entry.getKey());
      System.out.print(": ");
      System.out.println(entry.getValue());
    }
    System.out.println("=====");
    System.out.println("THE END");
 
  }
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎