content: package org.matsim.amodeus.waiting_time.dynamic;
  
  import java.util.Collection;
  import java.util.HashMap;
  import java.util.HashSet;
  import java.util.Map;
  import java.util.Set;
  
  import org.matsim.api.core.v01.Id;
  import org.matsim.api.core.v01.network.Link;
  import org.matsim.api.core.v01.network.Network;
  
  public class LinkGroupDefinition {
      private final int maximumIndex;
      private final Map<Id<Link>, Integer> indices;
  
      public LinkGroupDefinition(int maximumIndex, Map<Id<Link>, Integer> indices) {
          this.maximumIndex = maximumIndex;
          this.indices = indices;
      }
  
      public Collection<Id<Link>> getLinkIds(int index) {
          if (index > maximumIndex) {
              throw new IllegalAccessError();
          }
  
          Set<Id<Link>> linkIds = new HashSet<>();
  
          for (Map.Entry<Id<Link>, Integer> entry : indices.entrySet()) {
              if (entry.getValue() == index) {
                  linkIds.add(entry.getKey());
              }
          }
  
          return linkIds;
      }
  
      public int getGroup(Id<Link> linkId) {
          return indices.getOrDefault(linkId, -1);
      }
  
      public int getMaximumIndex() {
          return maximumIndex;
      }
  
      static public LinkGroupDefinition create(Network network, String attribute) {
          Map<Id<Link>, Integer> indices = new HashMap<>();
          int maximumIndex = 0;
  
          for (Link link : network.getLinks().values()) {
              Integer groupIndex = (Integer) link.getAttributes().getAttribute(attribute);
  
              if (groupIndex != null) {
                  indices.put(link.getId(), groupIndex);
                  maximumIndex = Math.max(maximumIndex, groupIndex);
              }
          }
  
          return new LinkGroupDefinition(maximumIndex, indices);
      }
  }
  