Java 排序功能-如何改进

Java 排序功能-如何改进,java,sorting,Java,Sorting,我有以下用于排序的代码。这能改进吗 import java.util.*; class Church { private String name; private String pastor; public Church(String name, String pastor) { this.name = name; this.pastor = pastor; } public String getPastor() {

我有以下用于排序的代码。这能改进吗

import java.util.*;
class Church {
    private String name;
    private String pastor;
    public Church(String name, String pastor) {
        this.name = name;
        this.pastor = pastor;
    }
    public String getPastor() {
        return pastor;
    }
    public String getName() {
        return name;
    }
    public void setPastor(String pastor) {
        this.pastor = pastor;
    }
    public String toString() {
        return getName() + " is Pastored by "+getPastor();
    }
    public int compareByPastor(Church c) {
        int x = pastor.compareTo(c.getPastor());
        return x;
    }
    public int compareByName(Church c) {
        int x = name.compareTo(c.getName());
        return x;
    }
}

class Churches {
    private final List<Church> churches;

    public Churches() {
        churches = new ArrayList<Church>();
    }
    public void addWithoutSorting(Church c) {
        churches.add(c);
    }

    //You could always add using this method
    public void addWithSorting(Church c) {

    }
    public void display() {
        for(int j = 0; j < churches.size(); j++) {
            System.out.print(churches.get(j).toString());
            System.out.println("");
        }
   }
   public List<Church> getChurches() {
       return churches;
   }
   public void sortBy(String s) {
       for (int i = 1; i < churches.size(); i++) {
           int j;
           Church val = churches.get(i);
           for (j = i-1; j > -1; j--) {
               Church temp = churches.get(j);
               if(s.equals("Pastor")) {
                   if (temp.compareByPastor(val) <= 0) {
                       break;
                   }
               }
               else if(s.equals("Name")) {
                   if (temp.compareByName(val) <= 0) {
                          break;
                   }
               }
               churches.set(j+1, temp);
            }
            churches.set(j+1, val);
       }
     }

    public static void main(String[] args) {
        Churches baptists = new Churches();
        baptists.addWithoutSorting(new Church("Pac", "Pastor G"));
        baptists.addWithoutSorting(new Church("New Life", "Tudor"));
        baptists.addWithoutSorting(new Church("My Church", "r035198x"));
        baptists.addWithoutSorting(new Church("AFM", "Cathy"));
        System.out.println("**********************Before Sorting***********************");
        baptists.display();
        baptists.sortBy("Pastor");
        System.out.println("**********************After sorting by Pastor**************");
        baptists.display();
        baptists.sortBy("Name");
        System.out.println("**********************After sorting by Name****************");
        baptists.display();

    }

  }
import java.util.*;
阶级教会{
私有字符串名称;
私人牧师;
公共教堂(字符串名称,字符串牧师){
this.name=名称;
这个。牧师=牧师;
}
公共字符串getPastor(){
回归牧师;
}
公共字符串getName(){
返回名称;
}
公共空间牧师(字符串牧师){
这个。牧师=牧师;
}
公共字符串toString(){
return getName()+”由“+getPastor()进行牧师化;
}
公共国际比较教堂(c座教堂){
intx=pastor.compareTo(c.getPastor());
返回x;
}
公共int比较码名称(教堂c){
intx=name.compareTo(c.getName());
返回x;
}
}
阶级教会{
私人最终名单教会;
公共教会(){
churches=新ArrayList();
}
不带出口的公共空间地址(教堂c){
增加(c);
}
//您始终可以使用此方法添加
公共空间与教堂(c座教堂){
}
公共空间显示(){
对于(int j=0;j<0.size();j++){
System.out.print(churches.get(j.toString());
System.out.println(“”);
}
}
公众名单{
回归教会;
}
公共无效排序(字符串s){
对于(int i=1;i<1.size();i++){
int j;
Church val=churches.get(i);
对于(j=i-1;j>-1;j--){
教堂温度=教堂获得(j);
如果(s.equals(“牧师”)){

if(temp.compareByPastor(val)查看Collections.sort(list,comparator)
查看集合。排序(列表、比较器)

课堂教学
{
公共void排序方式(字符串属性)
{
比较器c=零;
如果(“Name”.equals(attribute))c=new-namecomparator();
如果(“Pastor.equals(attribute))c=new ChurchNameComparator();
else System.out.println(“意外的排序属性:“+”属性+“”);
if(c!=null)Collections.sort(c,c);
}
私有静态最终类Comparator实现Comparator
{
公共int比较(教堂c1、教堂c2)
{
返回c1.getName().compareTo(c2.getName());
}
}
私有静态最终类Comparator实现Comparator
{
公共int比较(教堂c1、教堂c2)
{
返回c1.getPastor().compareTo(c2.getPastor());
}
}
}
课堂教学
{
公共void排序方式(字符串属性)
{
比较器c=零;
如果(“Name”.equals(attribute))c=new-namecomparator();
如果(“Pastor.equals(attribute))c=new ChurchNameComparator();
else System.out.println(“意外的排序属性:“+”属性+“”);
if(c!=null)Collections.sort(c,c);
}
私有静态最终类Comparator实现Comparator
{
公共int比较(教堂c1、教堂c2)
{
返回c1.getName().compareTo(c2.getName());
}
}
私有静态最终类Comparator实现Comparator
{
公共int比较(教堂c1、教堂c2)
{
返回c1.getPastor().compareTo(c2.getPastor());
}
}
}

这里真正的答案与iluxa的答案非常一致:您希望在Church对象上实现一个Comparator接口(示例代码,不过您需要确定什么构成了Church的大于/小于…),然后您可以使用Collections.sort()对它们进行排序。这将在一天结束时完成工作

当然,您刚才询问了有关堆栈溢出排序的建议,因此我不得不问您是否需要就地排序,您需要什么样的Big-O性能,然后请您在Quicksort、IntroSort、HeapSort、MergeSort和StoogeSort之间进行选择,以确定哪些最适合您

为了好玩,我曾经用Java编写了一些排序:

  • 强制快速排序到二次时间,这比我原先想象的要难
  • 这本书展示了如何实施
  • 这个演示了一个

我这样做是为了我自己的享受和教育。作为一般规则,对于这类事情,你要坚持使用标准库。

这里的真正答案与iluxa的基本一致:你想在你的教堂对象上实现一个比较器接口(示例代码,不过您需要确定什么构成教堂的大于/小于…),然后可以使用Collections.sort()对它们进行排序。这将在一天结束时完成工作

当然,您刚才询问了有关堆栈溢出排序的建议,因此我不得不问您是否需要就地排序,您需要什么样的Big-O性能,然后请您在Quicksort、IntroSort、HeapSort、MergeSort和StoogeSort之间进行选择,以确定哪些最适合您

为了好玩,我曾经用Java编写了一些排序:

  • 强制快速排序到二次时间,这比我原先想象的要难
  • 这本书展示了如何实施
  • 这个演示了一个

我这样做是为了我自己的享受和教育。作为一般规则,对于这类事情,你要坚持使用标准库。

编写两个自定义比较器:一个按牧师排序,另一个按姓名排序。当你想按牧师排序时,请调用
Collections.sort(你的列表,牧师比较器)
。如果要按姓名排序,请调用集合。排序(yourList,nameComparator)
。编写两个自定义比较程序:一个按牧师排序,另一个按姓名排序。如果要按牧师排序,请调用集合。排序(yourList,pastorComparator)。如果要按姓名排序,请调用
C
class Churches
{
    public void sortBy(String attribute) 
    {
      Comparator<Church> c = null;

      if ("Name".equals(attribute)) c = new ChurchNameComparator();
      else if ("Pastor".equals(attribute)) c = new ChurchNameComparator();
      else System.out.println("unexpected sort attribute : '" + attribute + "'");

      if (c != null) Collections.sort(churches, c);
    }

    private static final class ChurchNameComparator implements Comparator<Church> 
    {
      public int compare(Church c1, Church c2)
      {
        return c1.getName().compareTo(c2.getName());
      }
    }

    private static final class ChurchPastorComparator implements Comparator<Church> 
    {
      public int compare(Church c1, Church c2)
      {
        return c1.getPastor().compareTo(c2.getPastor());
      }
    }
}