`
128kj
  • 浏览: 601339 次
  • 来自: ...
社区版块
存档分类
最新评论

java中如何实现自定义排序

阅读更多
解题中经常用到自定义排序,把这篇文章放到这里备用。

   当需要排序的集合或数组不是单纯的数字型时,通常要用到两个接口Comparator或Comparable,以简单的方式实现对象排序或自定义排序。

一、Comparator
   强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。

接口方法:
/**
* @return o1小于、等于或大于o2,分别返回负整数、零或正整数。
*/
   int compare(Object o1, Object o2);

例:
import java.util.Arrays;
import java.util.Comparator;
public class SampleComparator implements Comparator {
  public int compare(Object o1, Object o2) {
    return toInt(o1) - toInt(o2);
  }
  private int toInt(Object o) {
    String str = (String) o;
    str = str.replaceAll("一", "1");
    str = str.replaceAll("二", "2");
    str = str.replaceAll("三", "3");
    // 
    return Integer.parseInt(str);
  }
  /**
   * 测试方法
   */
  public static void main(String[] args) {
    String[] array = new String[] { "一二", "三", "二" };
    Arrays.sort(array, new SampleComparator());
    for (int i = 0; i < array.length; i++) {
      System.out.println(array[i]);
    }
  }
}
C:\hdu>java SampleComparator
二
三
一二


二、Comparable
  强行对实现它的每个类的对象进行整体排序,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。

接口方法:
/**
* @return 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。
*/
  int compareTo(Object o);
假设对象User,需要按年龄排序:
import java.util.Arrays;
public class User implements Comparable {
  private String id;
  private int age;
  public User(String id, int age) {
    this.id = id;
    this.age = age;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public int compareTo(Object o) {
    return this.age - ((User) o).getAge();
  }
  /**
   * 测试方法
   */
  public static void main(String[] args) {
    User[] users = new User[] { new User("a", 30), new User("b", 20) };
    Arrays.sort(users);
    for (int i = 0; i < users.length; i++) {
      User user = users[i];
      System.out.println(user.getId() + " " + user.getAge());
    }
  }
}
C:\hdu>javac User.java

C:\hdu>java User
b 20
a 30

三、Comparator和Comparable的区别

先看一下使用Comparator对User集合实现排序的方式:

import java.util.Arrays;
import java.util.Comparator;
public class UserComparator implements Comparator {
  public int compare(Object o1, Object o2) {
    return ((User) o1).getAge() - ((User) o2).getAge();
  }
  /**
   * 测试方法
   */
  public static void main(String[] args) {
    User[] users = new User[] { new User("a", 30), new User("b", 20) };
    Arrays.sort(users, new UserComparator());
    for (int i = 0; i < users.length; i++) {
      User user = users[i];
      System.out.println(user.getId() + " " + user.getAge());
    }
  }
}
C:\hdu>java UserComparator
b 20
a 30


一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。 Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等


文章转自:http://www.blogjava.net/fastunit/archive/2008/04/08/191533.html
分享到:
评论

相关推荐

    java数组自定义排序

    java中数组的自定义排序,种类繁多,简单实现,可自由操控。

    Java 类自定义排序

    Java 中的自定义排序是指在编写 Java 程序时,通过实现 Comparable 接口来实现对对象的排序。在本节中,我们将通过一个实体类的示例来演示如何实现自定义排序。 自定义排序的必要性 在 Java 程序中,排序是非常...

    java中实现Comparable接口实现自定义排序的示例

    在 Java 中实现自定义排序的需求是非常普遍的,特别是在需要对对象数组或集合进行排序的时候。这篇文章将为大家带来一个使用 Comparable 接口实现自定义排序的示例。 首先,让我们来了解一下 Comparable 接口。...

    java Lucene 中自定义排序的实现

    Lucene中的自定义排序功能和Java集合中的自定义排序的实现方法差不多,都要实现一下比较接口. 在Java中只要实现Comparable接口就可以了.但是在Lucene中要实现SortComparatorSource接口和ScoreDocComparator接口.在...

    详解JAVA使用Comparator接口实现自定义排序

    JAVA使用Comparator接口实现自定义排序 JAVA中Comparator接口是Java Collections Framework中的一个重要接口,它提供了自定义排序的能力。通过实现Comparator接口,我们可以根据自己的需求来定义对象的排序规则。 ...

    ireport交叉报表自定义排序

    为了解决这一问题,可以通过以下两种方法来实现交叉报表中的自定义排序: 1. **通过SQL查询定制排序**:这种方法的核心思想是在SQL查询阶段就对数据进行预处理,从而实现自定义排序。 2. **利用iReport中的Crosstab...

    文件按照window 的排序规则-Java实现

    以下是关于如何在Java中实现Windows文件排序规则的详细解释: 1. **文件对象的创建**: 在Java中,我们可以使用`java.io.File`类来表示文件或目录。例如,创建一个File对象: ```java File file = new File("C:\...

    java 中文姓氏 排序

    ### Java 中文姓氏排序详解 #### 一、引言 ...通过上述代码示例,我们可以看到如何在 Java 中实现对含有中文姓名的数据进行排序。这在处理中文数据时非常有用,尤其是在需要按特定顺序显示数据的应用场景中。

    java中文排序,数字字母汉字排序

    在Java编程语言中,对包含中文、数字和字母的数据进行排序是一项常见的任务。这个场景下,我们关注的是如何实现一个自定义的排序规则,按照数字...希望这个解答能够满足你的需求,并帮助你深入理解Java中的自定义排序。

    493.491.JAVA基础教程_常用类-使用Comparator实现定制排序(493).rar

    在Java编程语言中,排序是数据...通过这个教程,你应该能够理解如何利用`Comparator`在Java中实现自定义排序,这在处理复杂数据结构和业务逻辑时尤其有用。学习并熟练运用`Comparator`能够提高代码的灵活性和可读性。

    Java实现拖拽列表项的排序功能

    在Java中,我们可能使用JavaFX或Swing来实现这样的功能。对于JavaFX,我们可以监听`onDragDetected`、`onDragEntered`、`onDragExited`、`onDragDropped`和`onDragDone`事件。以下是一个简化的JavaFX示例: ```java...

    Java语言实现六种排序算法

    Java中实现希尔排序需自定义间隔序列,然后根据间隔对元素进行插入排序。 6. 快速排序(Quick Sort) 快速排序由C.A.R. Hoare提出,采用分而治之的策略。选取一个基准元素,将数组分为比基准小和比基准大的两部分,...

    Java排序算法包 支持自定义比较条件

    总的来说,这个"Java排序算法包"为开发者提供了一个强大的工具,不仅包含了多种经典的排序算法,还允许用户通过自定义比较器来满足个性化排序需求,从而在不同的场景下都能实现高效且准确的排序。

    关于中文英文混合排序javaDemo

    为了解决这个问题,我们需要自定义排序规则。 在Java中,我们可以使用`Collator`类来处理字符串的排序,`Collator`提供了对不同语言和字符集的排序规则支持。对于中文和英文混合的排序,我们需要创建一个针对中文...

    java集合某个字段按照中文拼音排序.docx

    在Java中,我们可以使用Comparable接口来实现自定义排序。例如,我们可以创建一个Record类,实现Comparable接口,并重写compareTo方法。在compareTo方法中,我们可以使用String的compareTo方法来比较两个字符串的...

    java竞赛中各种自定义排序模板

    在Java编程语言中,特别是在算法竞赛的环境下,经常会遇到需要对数据进行自定义排序的情况。以下将详细讲解三种常见的自定义排序方式: 1. **对象数组排序**: Java不支持像C++那样的结构体,因此当需要处理具有多...

    【java自定义排序】.md

    Java自定义排序详解

    Java针对ArrayList自定义排序的2种实现方法

    Java语言中提供了多种方式来实现ArrayList的自定义排序,今天我们将介绍其中的两种实现方法。首先,让我们了解一下ArrayList的基本概念。ArrayList是一种动态数组,能够存储多种类型的对象,并且可以自动调整大小以...

    用JAVA实现的8大排序方法,有兴趣的可以一起研究

    本文将探讨在Java中实现的八大排序算法,这些算法在实际应用中各有优势,适用于不同的场景。通过深入理解并实践这些算法,可以提升你的编程技能和算法分析能力。 1. 冒泡排序(Bubble Sort) 冒泡排序是最简单的...

Global site tag (gtag.js) - Google Analytics