和風細雨

          世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運用之術自出。

          求集合差的幾種算法

          原題(這里使用了數組代替集合)

          有兩個數組:
          String[] arr01={"Andy","Bill","Cindy","Douglas","Felex","Green"};
          String[] arr02={"Andy","Bill","Felex","Green","Gates"};
          求存在于arr01而不存在于arr02的元素的集合?

          最容易想到的解法-雙重循環

          package com.junglesong;

          import java.util.ArrayList;
          import java.util.List;

          /**
           * 利用雙重循環實現的篩選
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2008-3-8
           
          */

          public class DoubleCycling{
              
          public static void main(String[] args){
                  String[] arr01
          ={"Andy","Bill","Cindy","Douglas","Felex","Green"};
                  String[] arr02
          ={"Andy","Bill","Felex","Green","Gates"};
                  
                  
          // 篩選過程,注意其中異常的用途
                  List<String> ls=new ArrayList<String>();
                  
          for(String str:arr01){
                      
          try{
                          ls.add(getNotExistStr(str,arr02));
                      }

                      
          catch(Exception ex){
                          
          continue;
                      }
                      
                  }

                  
                  
          // 取得結果
                  Object[] arr03=ls.toArray();
                  
          for(Object str:arr03){
                      System.out.println(str);
                  }

              }

              
              
          /**
               * 查找數組Arr中是否包含str,若包含拋出異常,否則將str返回
               * 
          @param str
               * 
          @param arr
               * 
          @return
               * 
          @throws Exception
               
          */

              
          public static String getNotExistStr(String str,String[] arr) throws Exception{
                  
          for(String temp:arr){
                      
          if(temp.equals(str)){
                          
          throw new Exception("");
                      }

                  }

                  
                  
          return str;
              }

          }


          速度較高的解法-利用哈希表

          package com.junglesong;

          import java.util.ArrayList;
          import java.util.Collection;
          import java.util.Hashtable;
          import java.util.List;
          import java.util.Map;

          /**
           * 利用哈希表進行篩選
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2008-3-8
           
          */

          public class HashtableFilter{
              
          public static void main(String[] args){
                  String[] arr01
          ={"Andy","Bill","Cindy","Douglas","Felex","Green"};
                  String[] arr02
          ={"Andy","Bill","Felex","Green","Gates"};
                  
                  
                  Map
          <String,String> ht=new Hashtable<String,String>();
                  
                  
          // 將arr02所有元素放入ht
                  for(String str:arr02){
                      ht.put(str, str);
                  }

                  
                  
          // 取得在ht中不存在的arr01中的元素
                  List<String> ls=new ArrayList<String>();
                  
          for(String str:arr01){
                      
          if(ht.containsKey(str)==false){
                          ls.add(str);
                      }

                  }

                  
                  
          // 取得結果
                  Object[] arr03=ls.toArray();
                  
          for(Object str:arr03){
                      System.out.println(str);
                  }

              }

          }

           

          最方便的解法-利用工具類

           

          package com.junglesong;

          import java.util.ArrayList;
          import java.util.List;

          /**
           * 使用工具類的篩選去除
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2008-3-8
           
          */

          public class Tool{
              
          public static void main(String[] args){
                  String[] arr01
          ={"Andy","Bill","Cindy","Douglas","Felex","Green"};
                  String[] arr02
          ={"Andy","Bill","Felex","Green","Gates"};
                  
                  
          // 直接轉的話,生成的List不支持removeAll
                  List<String> ls01=new ArrayList<String>();
                  
          for(String str:arr01){
                      ls01.add(str);
                  }

                  
                  
          // 同上
                  List<String> ls02=new ArrayList<String>();
                  
          for(String str:arr02){
                      ls02.add(str);
                  }

                  
                  
          // 去除arr01中存在于arr02中的元素
                  ls01.removeAll(ls02);
                  
                  
          // 取得結果
                  Object[] arr03=ls01.toArray();
                  
          for(Object str:arr03){
                      System.out.println(str);
                  }

              }

          }


          利用二叉樹的解法 

          package com.junglesong.binarytree;

          import java.util.ArrayList;
          import java.util.List;

          /**
           * 使用二叉樹的篩選去除
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2008-3-8
           
          */

          public class Test{
              
          public static void main(String[] args){
                  String[] arr01
          ={"Andy","Bill","Cindy","Douglas","Felex","Green"};
                  String[] arr02
          ={"Andy","Bill","Felex","Green","Gates"};
                  
                  
          // 以數組2為基礎創建二叉樹
                  Tree tree=new Tree();        
                  
          for(String str:arr02){
                      tree.insert(str);
                  }

                  
                  
          // 將在二叉樹中不存在的元素放入鏈錶
                  List<String> ls=new ArrayList<String>();        
                  
          for(String str:arr01){
                      
          if(tree.find(str)==null){
                          ls.add(str);
                      }

                  }

                  
                  
          // 輸出
                  for(String str:ls){
                      System.out.println(str);
                  }

              }

          }

          二叉樹節點類:
          package com.junglesong.binarytree;

          /**
           * 二叉樹節點類
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2008-3-8
           
          */

          public class Node{
              
          private String data;
              
          private Node left;
              
          private Node right;
              
              
          public Node(String data){
                  
          this.data=data;
              }


              
          public String getData() {
                  
          return data;
              }


              
          public Node getLeft() {
                  
          return left;
              }


              
          public Node getRight() {
                  
          return right;
              }


              
          public void setData(String data) {
                  
          this.data = data;
              }


              
          public void setLeft(Node left) {
                  
          this.left = left;
              }


              
          public void setRight(Node right) {
                  
          this.right = right;
              }

          }

          二叉樹樹類:
          package com.junglesong.binarytree;

          /**
           * 二叉樹類
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2008-3-8
           
          */

          public class Tree{
              
          /**
               * 根節點
               
          */

              
          private Node root;
              
              
          /**
               * 插入一個值
               * 
          @param str
               
          */

              
          public void insert(String str){
                  Node node
          =new Node(str);
                  
                  
          if(root==null){
                      root
          =node;
                  }

                  
          else{
                      Node curr
          =root;
                      Node parrent;
                      
                      
          while(true){
                          parrent
          =curr;
                          
                          
          if(str.compareTo(curr.getData())>0){
                              curr
          =curr.getRight();
                              
                              
          if(curr==null){
                                  parrent.setRight(node);
                                  
          return;
                              }

                          }

                          
          else{
                              curr
          =curr.getLeft();
                              
                              
          if(curr==null){
                                  parrent.setLeft(node);
                                  
          return;
                              }

                          }

                      }

                  }

              }

              
              
          /**
               * 尋找一個值對應的節點
               * 
          @param str
               * 
          @return
               
          */

              
          public Node find(String str){
                  Node curr
          =root;
                  
                  
          while(curr.getData().equals(str)==false){
                      
          if(str.compareTo(curr.getData())>0){
                          curr
          =curr.getRight();
                      }

                      
          else{
                          curr
          =curr.getLeft();
                      }

                      
                      
          if(curr==null){
                          
          return null;
                      }

                  }

                  
                  
          return curr;
              }

              
              
          /**
               * 輸出
               *
               
          */

              
          public void printAll(){
                  inorder(root);
              }

              
              
          /**
               * 中序遍歷
               * 
          @param node
               
          */

              
          private void inorder(Node node){
                  
          if(node!=null){
                      inorder(node.getLeft());
                      
                      
          if(node.getData().equals("EqualMark")==false){
                          System.out.println(node.getData());
                      }

                      inorder(node.getRight());
                  }

              }

          }


          代碼下載:
          http://www.aygfsteel.com/Files/junglesong/RemoveAll20080308023355.rar

          posted on 2008-03-08 02:25 和風細雨 閱讀(725) 評論(0)  編輯  收藏 所屬分類: 算法

          主站蜘蛛池模板: 普陀区| 亳州市| 衡阳市| 桑植县| 诏安县| 山东省| 合作市| 泽库县| 嘉峪关市| 石景山区| 大方县| 娄底市| 新龙县| 江门市| 宝山区| 尼勒克县| 大竹县| 宜城市| 大连市| 白朗县| 长葛市| 元江| 汝南县| 沁源县| 叙永县| 五原县| 商河县| 乐业县| 皮山县| 上饶县| 达州市| 波密县| 宽甸| 伽师县| 莫力| 西贡区| 措勤县| 惠州市| 横峰县| 阜新市| 东辽县|