/* * TestSort.java * * Created on April 1, 2005, 4:45 PM */ package se.arexis.agdb.test; import java.util.ArrayList; import se.arexis.agdb.db.DbException; /** * * @author heto */ public class TestSort { /** Creates a new instance of TestSort */ public TestSort() { } class Dependency { public String name; public String[] dep; public Dependency(String name, String[] dep) { this.name = name; this.dep = dep; } } private int indexOf(ArrayList<Dependency> sorted, String name) { for (int i=0;i<sorted.size();i++) { if (sorted.get(i).name.equals(name)) { return i; } } return -1; } public void print(ArrayList<Dependency> list) { for (int i=0;i<list.size();i++) { System.out.print(list.get(i).name+ " : "); for (int j=0;j<list.get(i).dep.length;j++) { System.out.print(list.get(i).dep[j]); } System.out.println(""); } } public void sort(ArrayList<Dependency> list) throws DbException { int i=0; // Loop limiter, detect circular dependencies // If the loop cannot correctly sort the list in 100 loops, the // sorting fails int k=0; boolean done = false; boolean move = false; while (i<list.size()) { move = false; Dependency tmp = list.get(i); for (int j=0;j<tmp.dep.length;j++) { String name = tmp.dep[j]; int index = indexOf(list,name); if (index > i) { list.add(i,list.get(index)); list.remove(index+1); move=true; } } if (move==false) i++; k++; if (k>100) throw new DbException("Circular dependencies. 100 tries to sort list exeeded."); } } public void runSort() { ArrayList<Dependency> list = new ArrayList(); list.add(new Dependency("INDIVIDUAL",new String[] {})); list.add(new Dependency("MARKER",new String[] {"MARKERSET"})); list.add(new Dependency("GENOTYPE",new String[] {"INDIVIDUAL","MARKER"})); list.add(new Dependency("MARKERSET",new String[] {})); list.add(new Dependency("VARIABLE",new String[] {"VARIABLESET"})); list.add(new Dependency("VARIABLESET",new String[] {})); list.add(new Dependency("PHENOTYPE",new String[] {"VARIABLE"})); /* ArrayList indNames = new ArrayList(); ArrayList grpNames = new ArrayList(); ArrayList smpNames = new ArrayList(); ArrayList varSetNames = new ArrayList(); ArrayList uVarSetNames = new ArrayList(); ArrayList uVarNames = new ArrayList(); ArrayList varNames = new ArrayList(); ArrayList pheNames = new ArrayList(); ArrayList marSetNames = new ArrayList(); ArrayList uMarkSetNames = new ArrayList(); ArrayList uMarkNames = new ArrayList(); ArrayList marNames = new ArrayList(); ArrayList genNames = new ArrayList(); ArrayList mapNames = new ArrayList(); */ try { sort(list); print(list); } catch (Exception e) { e.printStackTrace(); } } public void alg2() throws DbException { ArrayList<Dependency> list = new ArrayList(); list.add(new Dependency("F",new String[] {"D","J"})); list.add(new Dependency("G",new String[] {"E","D","F"})); list.add(new Dependency("A",new String[] {})); list.add(new Dependency("E",new String[] {})); list.add(new Dependency("C",new String[] {"B"})); list.add(new Dependency("D",new String[] {"B"})); list.add(new Dependency("B",new String[] {"A","E"})); list.add(new Dependency("H",new String[] {"I"})); list.add(new Dependency("I",new String[] {"C"})); list.add(new Dependency("J",new String[] {"I","B","F","H"})); int i=0; // Loop limiter, detect circular dependencies // If the loop cannot correctly sort the list in 100 loops, the // sorting fails int k=0; boolean done = false; boolean move = false; while (i<list.size()) { move = false; Dependency tmp = list.get(i); // If this object has no dependency then move this to begining of // the list. if (tmp.dep.length==0 && i!=0) { /* list.add(0,tmp); list.remove(i); move=true; */ } else { for (int j=0;j<tmp.dep.length;j++) { String name = tmp.dep[j]; int index = indexOf(list,name); if (index > i) { list.add(i,list.get(index)); list.remove(index+1); move=true; } } } if (move==false) i++; k++; if (k>100) throw new DbException("Circular dependencies. 100 tries to sort list exeeded."); } print(list); } public void testThis() { ArrayList<Dependency> unsorted = new ArrayList(); unsorted.add(new Dependency("F",new String[] {"D"})); unsorted.add(new Dependency("G",new String[] {"E","D","F"})); unsorted.add(new Dependency("A",new String[] {})); unsorted.add(new Dependency("E",new String[] {})); unsorted.add(new Dependency("C",new String[] {"B"})); unsorted.add(new Dependency("D",new String[] {"B"})); unsorted.add(new Dependency("B",new String[] {"A","E"})); ArrayList<Dependency> sorted = new ArrayList(); boolean done = false; int i=0; while (!done) { sorted.add(0,unsorted.get(0)); unsorted.remove(0); boolean resort = true; boolean added = false; while (resort) { added=false; for (int j=0;j<sorted.get(i).dep.length;j++) { String name = sorted.get(i).dep[j]; int index = indexOf(unsorted,name); if (indexOf(sorted,name)==-1) { sorted.add(0,unsorted.get(index)); added=true; } if (index!=-1) unsorted.remove(index); } if (added==false) resort=false; i=0; } print(sorted); System.out.println("---------"); if (unsorted.size()==0) done = true; //i++; } } }