已知几种元素大小关系,求排序(图形结构遍历)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值