复杂数据结构的排序和检索问题

来源:互联网 发布:three.js游戏 编辑:程序博客网 时间:2024/05/01 23:08

     前面几篇讨论了利用ArrayList和Collections对数据元素进行排序和折半查找的功能。但排序也仅限于简单结构的排序,如{452,3,5,14,89,632}等,检索也是针对这些简单结构的检索,采用默认的排序算法和比较器就可以进行。但实际应用中却往往没有那么简单,我们经常需要对一个具有复杂数据结构的列表进行排序和检索操作,直接应用其默认算法是不可能实现的。这时,通常需要针对特定的复杂数据结构自定义一个比较器Comparator,通过这个来实现我们的功能。

   在网上搜集了一下,发现在复杂数据结构方面的文章尤其是优秀的文章很少,但有一篇我很满意,它帮我解决了问题,URL是:http://blog.csdn.net/blundblade/archive/2004/08/07/67774.aspx,原文作者对这个问题有很深入的阐述并有详细的示例。我在原文的基础上,作了一个小小的修改,补充了检索功能和对检索出的某个元素(列表中的一个对象)的处理功能。如,可以利用BinarySearch()方法检索出符合条件的元素(对象),然后对这个元素的某数据项(子元素)进行处理,如我的程序中使其工资(pay)的值增加100。这样,复杂数据结构的排序、检索、元素处理问题都一并解决了了,呵呵!

   下面是我对http://blog.csdn.net/blundblade/archive/2004/08/07/67774.aspx修改后的程序代码。

import java.util.ArrayList;
import java.util.Collections;

public class StructureSort {
 public static void main(String[] args){
  
  ArrayList list = new ArrayList();

        list.add(new Programmers("张三", "C", 12000));

        list.add(new Programmers("李四", "Java", 200));

        list.add(new Programmers("王五", "C++", 5000));

        list.add(new Programmers("钱六", "VB", 3000));

        System.out.println("before sort: " + list);
       
        Collections.sort(list);
        System.out.println("after sort: " + list);  
         
        int i=Collections.binarySearch(list,new Programmers("张三", "C", 5000));//检索某元素
        if (i>=0){Object j=list.get(i);//下面取出第三个元素,对其进行加法运算.
        Programmers other0 = (Programmers)j;
        int m=(int)other0.pay+100;//类词频加1
    
        System.out.println("工资变为: " +m);
     
        };
        //int i=Collections.binarySearch(list,new Programmers("", "", 12000));实际应用时采用这个,呵呵!
      
        System.out.println("序号为: " + i);
 }
 
 

}
class Programmers implements Comparable{

    private String name;

    private String language;

    double pay;

   

    public Programmers(String name, String language, double pay) {

       this.name = name;

       this.language = language;

       this.pay = pay;

    }

 

    public int compareTo(Object o) {

       Programmers other = (Programmers)o;
       return (int)pay - (int)other.pay;

    }

 

    public String toString(){

       return "{name: " + name + ", language: " + language + ", money: " + pay + "}";

    }

}

 运行结果是:

before sort: [{name: 张三, language: C, money: 12000.0}, {name: 李四, language: Java, money: 200.0}, {name: 王五, language: C++, money: 5000.0}, {name: 钱六, language: VB, money: 3000.0}]
after sort: [{name: 李四, language: Java, money: 200.0}, {name: 钱六, language: VB, money: 3000.0}, {name: 王五, language: C++, money: 5000.0}, {name: 张三, language: C, money: 12000.0}]
工资变为: 5100
序号为: 2