CardSetControl.java :  » Game » ipcards » ipcards » Java Open Source

Java Open Source » Game » ipcards 
ipcards » ipcards » CardSetControl.java
package ipcards;

import java.util.*;


public class CardSetControl extends ArrayList<CardSet> {

  private ArrayList<CardSet> groups = new ArrayList<CardSet>();
  private Map<Card,CardSet> cardgroup = new HashMap<Card,CardSet>();
  
  

  CardSet allcards;
  

  public CardSetControl(CardSet listOfAllCards) {
    allcards = listOfAllCards;
System.out.println("allCards in CardSetControl is of size: " + listOfAllCards.size());    
  }

  public void buildGroups(CardSet allCardsZOrdered) {

System.out.println("build" + allCardsZOrdered.size());    
    groups = new ArrayList<CardSet>();
    cardgroup = new HashMap<Card,CardSet>();
    
    for (Card c: allCardsZOrdered) {    
      ArrayList<CardSet> overlapgroups = new ArrayList<CardSet>();  // list of groups this card overlaps with
      
      for(Card other: cardgroup.keySet()) {
        if (c.overlaps(other)) {
          CardSet g = cardgroup.get(other);
          if(!overlapgroups.contains(g)) {
            overlapgroups.add(g);
          }
        }
      }
      
      CardSet mergegroup = new CardSet(c);  // new group, that has the new card in it
      
      for(CardSet g: overlapgroups) {
        mergegroup.addAll(g);
        groups.remove(g);
      }
      
      groups.add(mergegroup);
      
      for(Card cd: mergegroup) {
        cardgroup.put(cd,mergegroup);
      }
    }
  }
    
  
  public void rebuildGroups() {

    LinkedList<Card> allcardsZordered = getZOrderingConcatenated();
System.out.println("rebuild" + allcardsZordered.size() + groups.size());    
    groups = new ArrayList<CardSet>();
    cardgroup = new HashMap<Card,CardSet>();
    
    System.out.print("before: ");
    for (Card c: allcardsZordered) {
      System.out.print(c.getID() + " ");
    }
    
    for (Card c: allcardsZordered) {

      ArrayList<CardSet> overlapgroups = new ArrayList<CardSet>();  // list of groups this card overlaps with
      
      for(Card other: cardgroup.keySet()) {
        if (c.overlaps(other)) {
          CardSet g = cardgroup.get(other);
          if(!overlapgroups.contains(g)) {
            overlapgroups.add(g);
          }
        }
      }
      
      CardSet mergegroup = new CardSet(c);  // new group, that has the new card in it
      for(CardSet g: overlapgroups) {
        mergegroup.addAll(g);
        groups.remove(g);
      }
      groups.add(mergegroup);
      for(Card cd: mergegroup) {
        cardgroup.put(cd,mergegroup);
      }
    }
    
    System.out.print("after: ");
    for (Card c: allcardsZordered) {
      System.out.print(c.getID() + " ");
    }
  }
  
  
  public Collection<CardSet> getGroups() {
    return groups;
  }

  //PREFERRABLE TO METHODS BELOW
  public LinkedList<Card> getZOrderingConcatenated() {

    LinkedList<Card> allCardsZOrdered = new LinkedList<Card>();
        
    for(CardSet g: groups) {
      allCardsZOrdered.addAll(g.getZAscendingList());
    }
    
    System.out.println("getZOrderingConcatenated(): ");
    for (Card c: allCardsZOrdered) {
      System.out.print(c.getID() + " ");
    }
    return allCardsZOrdered;
  }
        
      
  
  
  //TO USE IF AND ONLY IF THE CASE ABOVE SHOULD FAIL FOR SOME UNANTICIPATED REASON
  
  public LinkedList<Card> getAllCardsZOrdered() {
    LinkedList<Card> allCardsZOrdered = new LinkedList<Card>(allcards);
    int groupnum = 0;
    int[] groupSizes = new int[groups.size()];
    for(CardSet g: groups) {
      groupSizes[groupnum] = g.size();
      groupnum++;
    }
    
    groupnum = 0;
    
    for(CardSet g: groups) {
      int[] gSizes = groupSizes;
      int diff = gSizes.length;
      int cardnum = 0;
      int position = groupnum;
      
      for(Card c: g) {
        int[] min = getMinimum(gSizes);
        while(cardnum >= min[1]) {
          diff--;
          if(min[0] < groupnum) {    //if position of minimum is before the current group
            position--;
          }
          gSizes[min[0]] = 99999999;    //reset minimum
          min = getMinimum(gSizes);
        }
        
        allCardsZOrdered.set(position, c);
        position += diff;
        cardnum++;
      }
      
      groupnum++;
    }
    
    return allCardsZOrdered;
  }
  
  private int[] getMinimum(int[] groupsizes) {
    int minimum = 99999999;
    int position = -1;
    for(int i=0; i < groupsizes.length; i++) {
      if(groupsizes[i] < minimum) {
        minimum = groupsizes[i];
        position = i;
      }
    }
    
    int[] toReturn = new int[2];
    toReturn[0] = position;
    toReturn[1] = minimum;
    return toReturn;
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.