import java.util.*; public class Testsort { /** * 已知几种元素大小关系,求排序 * a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19 * 已知a1>a2,a2>a3,a1>a4,a2>a5,a5>a8,a6>a7,a4>a11,a9>a10等 * 求其中的随便一种排序 */ private static final List<EntrySort> alist=new ArrayList();//关系集合 private static final List<EntryA> aAlist=new ArrayList();//元素集合 private static final Set<EntryA> maxA=new HashSet<>();//顶点元素 private static int ItopY; private static EntryA [][] As; private static int asize; private static final EntryA a1=new EntryA("a1"); private static final EntryA a2=new EntryA("a2"); private static final EntryA a3=new EntryA("a3"); private static final EntryA a4=new EntryA("a4"); private static final EntryA a5=new EntryA("a5"); private static final EntryA a6=new EntryA("a6"); private static final EntryA a7=new EntryA("a7"); private static final EntryA a8=new EntryA("a8"); private static final EntryA a9=new EntryA("a9"); private static final EntryA a10=new EntryA("a10"); private static final EntryA a11=new EntryA("a11"); private static final EntryA a12=new EntryA("a12"); private static final EntryA a13=new EntryA("a13"); private static final EntryA a14=new EntryA("a14"); private static final EntryA a15=new EntryA("a15"); private static final EntryA a16=new EntryA("a16"); private static final EntryA a17=new EntryA("a17"); private static final EntryA a18=new EntryA("a18"); private static final EntryA a19=new EntryA("a19"); static{ alist.add(new EntrySort(a1,a2)); alist.add(new EntrySort(a2,a3)); alist.add(new EntrySort(a2,a4)); alist.add(new EntrySort(a3,a5)); alist.add(new EntrySort(a1,a4)); alist.add(new EntrySort(a4,a5)); alist.add(new EntrySort(a2,a5)); alist.add(new EntrySort(a5,a8)); alist.add(new EntrySort(a6,a7)); alist.add(new EntrySort(a4,a11)); alist.add(new EntrySort(a9,a10)); alist.add(new EntrySort(a4,a7)); alist.add(new EntrySort(a5,a9)); alist.add(new EntrySort(a7,a12)); alist.add(new EntrySort(a13,a12)); alist.add(new EntrySort(a12,a14)); alist.add(new EntrySort(a12,a15)); alist.add(new EntrySort(a17,a16)); alist.add(new EntrySort(a17,a18)); aAlist.add(a1);aAlist.add(a2);aAlist.add(a3); aAlist.add(a4);aAlist.add(a5);aAlist.add(a6); aAlist.add(a7);aAlist.add(a8);aAlist.add(a9); aAlist.add(a10);aAlist.add(a11);aAlist.add(a12); aAlist.add(a13);aAlist.add(a14);aAlist.add(a15); aAlist.add(a16);aAlist.add(a17);aAlist.add(a18); aAlist.add(a19); asize=aAlist.size(); As=new EntryA[asize][asize]; //建立图形结构 for (EntrySort en: alist) { EntryA au=null; EntryA ad=null; for (EntryA ennext: aAlist) { if(ennext.key.equals(en.key.key)){ au=ennext; }else if(ennext.key.equals(en.value.key)){ ad=ennext; } } if(au!=null&&ad!=null) { au.addNext(ad); ad.addUpA(au); } } //优化图形结构并判断关系合法性 for (EntryA en:aAlist) { Set<EntryA> aset = new HashSet<>(); Set<EntryA> anset = new HashSet<>(); if(en.upA !=null) { for (EntryA enup : en.upA) { if(enup.upA!=null&&!enup.upA.isEmpty()) aset.addAll(enup.upA); } en.upA.removeAll(aset); } if(en.next!=null) { for (EntryA enup : en.next) { if(enup.next!=null&&!enup.next.isEmpty()) anset.addAll(enup.next); } en.next.removeAll(anset); } for (EntryA en1:aset) { for (EntryA enn:anset) { if(en1.equals(enn)){ System.out.println("关系不合法"); throw new RuntimeException("关系不合法"); } } } } for (EntryA en:aAlist) { maxA.add(getMaxA(en)); } } public static void main(String [] args){ printAll(aAlist); for (EntryA en:aAlist) { System.out.print(en.key+": "); printAEnd(en,true); System.out.println(); System.out.print(en.key+": "); printA(en,true); System.out.println(); } for (EntryA en:aAlist) { System.out.println(en); } } public static void printAll(List<EntryA> aAlist){ if(!maxA.isEmpty()){ Iterator it=maxA.iterator(); while(it.hasNext()){ EntryA en= (EntryA) it.next(); System.out.print("顶点元素:"+en.key+" :"); printA(en,true); System.out.println(); printXY(As); System.out.println(); } } } //设置元素坐标 public static void setEntryAXY(EntryA a){ int x= getUpAXX(a); int y= getUpAYY(a); int i=0; while(As[x][y+i]!=null){ i++; } As[x][y+i]=a; a.x=x; a.y=y+i; //顶点修正 if(a.upA!=null&&!a.upA.isEmpty()) for(EntryA en:a.upA){ if(en.upA==null||en.upA.size()<=0) { As[en.x][en.y] = null; i = 0; while (As[en.x][a.y + i] != null||(As[a.x][a.y+i]!=null&&i>0)) { i++; } As[en.x][a.y + i] = en; en.y = a.y + i; if(i>0){ As[a.x][a.y] = null; As[a.x][a.y + i] = a; a.y = a.y + i; } } } } public static void printXY(EntryA[][] As){ System.out.println("图结构:"); for (int y=0;y<asize;y++){ boolean isp=false; for (int x=0;x<asize;x++){ if(As[x][y]!=null) isp=true; } if(!isp) continue; for (int x=0;x<asize;x++){ if(As[x][y]!=null) { if(x>0) System.out.print("->"); System.out.print(As[x][y].key+(As[x][y].key.length()==2?" ":"")); }else { if(x>0) System.out.print(" "); System.out.print(" "); } } System.out.println(); } } public static EntryA getMaxA(EntryA a){ if(a==null||a.upA==null||a.upA.size()<=0) return a; if(a.upA!=null){ for (EntryA en :a.upA) { return getMaxA(en); } } return a; } public static void printA(EntryA a,boolean isClean){ if(isClean) cleanAPrint(); printA(a); } public static void cleanAPrint(){ ItopY=0; As=new EntryA[asize][asize]; for (EntryA en:aAlist) { en.isPrint=false;//是否打印过 en.isquery=false;//是否检索过 } } //获取横坐标 public static int getUpAXX(EntryA a) { int re=0; if (a.upA != null && !a.upA.isEmpty()){ for (EntryA en :a.upA) { re =re>=en.x+1?re:en.x+1; } } return re; } //获取竖坐标 public static int getUpAYY(EntryA a) { int re=0; int rup=0; if (a.upA != null && !a.upA.isEmpty()){ for (EntryA en :a.upA) { if(rup==0) rup=en.y; rup =en.y<rup?en.y:rup; } re= rup; }else{ re= ItopY++; } return re; } //正向 public static void printA(EntryA a){ if(a.isPrint) return; if(isPrint(a)) { System.out.print(a.key + ","); setEntryAXY(a); a.isPrint=true; } else if(!isPrint(a)){ printAEnd(a); } if(!a.isquery&&a.next!=null){ a.isquery=true; for (EntryA aa: a.next) { printA(aa); } } } //逆向 public static void printAEnd(EntryA a,boolean isClean){ if(isClean) cleanAPrint(); printAEnd(a); } public static void printAEnd(EntryA a){ if(a.isPrint) return; if(a.upA!=null&&!a.upA.isEmpty()){ for (EntryA aa: a.upA) { printAEnd(aa); } } if(!a.isPrint&&isPrint(a)) { System.out.print(a.key + ","); setEntryAXY(a); a.isPrint=true; } if(!a.isquery&&a.next!=null){ a.isquery=true; for (EntryA aa: a.next) { printA(aa); } } } //判断其上级节点是否打印过 public static boolean isPrint(EntryA a){ if(a.upA==null||a.upA.size()==0) return true; if(!a.upA.isEmpty()){ for ( EntryA en: a.upA) { if(!en.isPrint) return false; } } return true; } /** * 大小关系保存对象 key>value */ static class EntrySort{ EntryA key; EntryA value; public EntrySort(EntryA a,EntryA b){ this.key=a; this.value=b; } @Override public String toString() { return "["+key.key+","+value.key+"]"; } } /** * 元素实体类 */ static class EntryA{ Set<EntryA> next; //上级节点 Set<EntryA> upA; //下级节点 String key; //元素值 boolean isPrint=false;//是否打印过 boolean isquery=false;//是否检索过 int x; // 数组x坐标 int y; // 数组y坐标 public EntryA(String a){ this.key=a; } public void addNext(EntryA a){ if(next==null){ next=new HashSet<EntryA>(); } if(a!=null) next.add(a); } public void addUpA(EntryA a){ if(upA==null){ upA=new HashSet<EntryA>(); } if(a!=null) upA.add(a); } public void delNext(EntryA a){ if(next!=null&&a!=null){ Iterator it=next.iterator(); while(it.hasNext()){ EntryA en=(EntryA)it.next(); if(en.equals(a)) it.remove(); } if(next.isEmpty()) next=null; } } public boolean equals(EntryA a){ if(a!=null&&key.equals(a.key)) return true; return false; } @Override public String toString() { String re="Key="+key+" 坐标["+x+","+y+"]"; if(upA!=null&&!upA.isEmpty()){ re+="上级["; for (EntryA en:upA) { re+=en.key; } re+="]"; } if(next!=null&&!next.isEmpty()){ re+="下级["; for (EntryA en:next) { re+=en.key; } re+="]"; } return re; } } }
转载于:https://my.oschina.net/u/3986494/blog/2222450