排序算法 - 如何在main中实现我的类:)

时间:2014-04-14 10:40:29

标签: java algorithm sorting comparator bubble-sort

这是一个愚蠢的问题。我有自己的比较器接口,类Student - 它的对象将被排序,类BubbleSort与bubblesorting算法和main。我认为除了main之外的每个类都写得很好,但我在main中实现它们有问题让我的排序开始:/我刚刚创建了随机学生的ArrayList我想要排序,但我有问题BubbleSort类并不知道如何开始。

将来(我希望今天会这样:))我将在这里与包含排序算法(如BubbleSort)的其他类完全相同。我认为他们在main中的实现是完全相同的。

import java.util.Random;
import java.util.ArrayList;

public class Program {

    public static void main(String[] args) {
        int elements = 100000;
        ArrayList<Student> list = new ArrayList<Student>();
        Random rand = new Random();
        for (int i=0; i<elements; i++) {
            list.add(new Student(rand.nextInt(4)+2, rand.nextInt(900000)));
        }
        System.out.println(list);
    }
}

import java.util.ArrayList;

public class BubbleSort {

    private final Comparator comparator;

    public BubbleSort(Comparator comparator) { 
        this.comparator = comparator; 
    }

    public ArrayList<Student> sort(ArrayList<Student> list) {
        int size = list.size();
        for (int pass = 1; pass < size; ++pass) {
            for (int left = 0; left < (size - pass); ++left) {
                int right = left + 1;
                if (comparator.compare(list.get(left), list.get(right)) > 0)
                    swap(list, left, right);
            }
        }
        return list;
    }

    public int compare(Object left, Object right) throws ClassCastException
            { return comparator.compare(left, right); }


    private void swap(ArrayList list, int left, int right) {
        Object temp = list.get(left);
        list.set(left, list.get(right));
        list.set(right, temp);
    }
}

public class Student implements Comparator<Student> {

    int rate;
    int indeks;

    public Student(int ocena, int index) {
        this.rate = ocena;
        indeks = index;
    }

    public String toString() {
        return "Numer indeksu: " + indeks + " ocena: " + rate + "\n";
    }

    public int getIndeks() {
        return indeks;
    }

    public int getRate() {
        return rate;
    }

    public int compare(Student left, Student right) {
        if (left.getIndeks()<right.getIndeks()) {
            return -1;
        }
        if (left.getIndeks() == right.getIndeks()) {
            return 0;
        }
        else {
            return 1;
        }
    }

}

public interface Comparator<T> {
    public int compare(T left, T right) throws ClassCastException;
}

3 个答案:

答案 0 :(得分:1)

这里有两点要点:
a)你根本不打电话。您需要实例化您的BubbleSort类并实际调用该方法。 list = new BubbleSort(new Comparator(){...}).sort(list);&lt; - 此语法还要求sort方法是静态的,这样您就不需要为每种排序创建一个新对象。以下示例按索引排序。

list = new BubbleSort(new Comparator<Student>() {
    @Override
    public compare(Student a, Student b) {
        return a.getIndeks() - b.getIndeks();
    }
}).sort(list);

顺便说一下,这也假设BubbleSort是通用的,因为它更容易(并且有点理解) b)我希望这是某种项目,你必须展示你制作排序算法的能力,否则你应该使用库方法来做这些事情

此外,虽然代码还不错,但您可能希望将其展示给具有专业Java经验的人(它不符合许多标准,许多内容可以改进并且彼此保持一致),或者发布它到https://codereview.stackexchange.com/

答案 1 :(得分:1)

你的代码看起来有点奇怪。你没有提及,如果你必须使用冒泡排序,那么我写下我的想法

1. 未明确使用冒泡排序

您可以结合覆盖Collections.sort()方法

使用compareTo()

所以你的代码看起来像这样

class Student implements Comparable<Student>{
//variables constructor methods go here
private index;
@Override
public int compareTo(Students s) {
    int index = s.index;
    if (this.index > index) {
        return 1;
    } else if (this.index == index) {
        return 0;
    } else {
        return -1;
    }
}

} 在您的主要班级Collections.sort(myStudents)

2. 明确使用冒泡排序

学生班

    class Student{
    //class variables methods constructor goes here
    }

比较者班

    class StudentComparator implements Comparator<Student>{
        @Override
        public int compare(Student a, Student b) {
           //bubble sort code goes here
        }}

主要课程

     class MyMainClass{
          public static void main(String[] args) {
          public int elements = 100000;
          ArrayList<Student> list = new ArrayList<Student>();
          Random rand = new Random();
          for (int i=0; i<elements; i++) {
                list.add(new Student(rand.nextInt(4)+2, rand.nextInt(900000)));
            }
          Collections.sort(list, new StudentComparator());

           }

答案 2 :(得分:0)

我没有看到你在任何地方调用bubblesort类。列表不会自动对其元素进行排序。请仔细阅读此链接。你会发现它很方便。 http://www.programcreek.com/2013/03/hashset-vs-treeset-vs-linkedhashset/