【问题标题】:How to make a selection sort without using the compare() method in java?如何在不使用 java 中的 compare() 方法的情况下进行选择排序?
【发布时间】:2020-01-04 22:27:29
【问题描述】:

问候 StackOverFlow 社区!

我最近开始在学校学习java,其中一个任务是创建一种排序方法,如选择排序或插入排序,而不使用java自己的内置函数。我在网上看了很多,我发现的所有方法都是针对Arrays而不是ArrayLists的。分配的目标是按照尾巴长度对狗类进行排序,如果狗的尾巴长度相同,也按照名称排序。 到目前为止,这就是我所做的;

狗类

public class Dog {
private static final double DEFAULT_TAIL_SIZE = 10.0;
private static final double DEFAULT_TAX_SIZE = 3.7;
private static int count;
private String name;
private String breed;
private int age;
private int weight;
private double tailLenght;


public Dog(String name, String breed, int age, int weight) {
    //count++;
    this.name = name;
    this.age = age;
    this.breed = breed;
    this.weight = weight;
    this.tailLenght = tailLenght;

}

public String getName() {
    return name;
}

public int getAge() {
    return age;
}

public String getBreed() {
    return breed;
}

public int getWeight() {
    return weight;
}

public void setAge(int age) {
    age = age <= 0 ? 1 : age;
}

public double getTailLength() {
    if (breed.equals("Tax") || breed.equals("dachshund")||breed.equals("tax") || breed.equals("Dachshund")) {
        return tailLenght = DEFAULT_TAX_SIZE;
    } else {
        return tailLenght = age * weight/DEFAULT_TAIL_SIZE;
    }

}
@Override
public String toString() {
    //System.out.println(String.format("name=%s breed=%s age=%d weight=%d taillenght=%.1f", name, breed, age, weight, getTailLength()));
    return name + " " + breed + " " + age + " " + weight + " " + getTailLength();
}

这是我制作的排序代码,由于代码使用内置的 java 排序方法而未被接受。 这是我在此次作业期间唯一可以编辑的代码

public class DogSorter {

public void sort(ArrayList<Dog> dogs) {
    dogs.sort(new Comparator<Dog>() {
        @Override
        public int compare(Dog d1, Dog d2) {
            int comparison = 0;
            comparison = Double.valueOf(d1.getTailLength()).compareTo(d2.getTailLength());
            if (comparison == 0) {
                comparison = String.valueOf(d1.getName()).compareTo(d2.getName());
            }
            return comparison;

        }

    });
}

最后这是我们从老师那里收到的跑步者代码

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

public class DogSorterRunner {
    private static final int NUMBER_OF_DOGS = 12;

private static final Random RND = new Random();
private static final String[] NAMES = { "Fido", "Karo", "Molly", "Bella", "Wilma", "Doris", "Sigge", "Charlie",
        "Ludde", "Bamse", "Lassie", "Ronja", "Ratata", "Maki", "Dora", "Luna", "Spike", "Mumsan", "Cherie" };

private static final String[] BREEDS = { "Labrador", "Golden retriever", "Tax", "Dachshund" };

private static String getRandomValueFromArray(String[] array) {
    return array[RND.nextInt(array.length)];
}

private static String randomName() {
    return getRandomValueFromArray(NAMES);
}

private static String randomBreed() {
    return getRandomValueFromArray(BREEDS);
}

private static int randomNumber() {
    return RND.nextInt(10) + 1;
}

public static void main(String[] args) {
    ArrayList<Dog> dogs = new ArrayList<>();

    for (int n = 0; n < NUMBER_OF_DOGS; n++) {
        Dog dog = new Dog(randomName(), randomBreed(), randomNumber(), randomNumber());
        dogs.add(dog);
    }

    new DogSorter().sort(dogs);

    for (Dog dog : dogs) {
        System.out.println(dog);
    }
}

任何帮助和反馈将不胜感激!

【问题讨论】:

    标签: java sorting arraylist


    【解决方案1】:

    赋值的重点是你应该自己实现selectioninsertion排序,而不是使用Java内置的排序功能。这就是您在实现排序算法方面展示一些知识的方式。

    这是一个选择排序的示例,它基于您的条件(尾部和名称),应该让您了解函数的外观。做一些练习,我建议你尝试自己实现插入排序。

    public class DogSorter {
    
        public void sort(ArrayList<Dog> dogs) {
            dogs.sort(new Comparator<Dog>() {
                @Override
                public int compare(Dog d1, Dog d2) {
                    int comparison = 0;
                    comparison = Double
                            .valueOf(d1.getTailLength())
                            .compareTo(d2.getTailLength());
                    if (comparison == 0) {
                        comparison = String
                                .valueOf(d1.getName())
                                .compareTo(d2.getName());
                    }
                    return comparison;
                }
            });
        }
    
        public void selectionSort(ArrayList<Dog> dogs) {
            int n = dogs.size();
    
            // One by one move boundary of unsorted subarray
            for (int i = 0; i < n - 1; i++) {
                // Find the minimum element in unsorted array
                int min_idx = i;
                for (int j = i + 1; j < n; j++) {
                    Dog d1 = dogs.get(j);
                    Dog d2 = dogs.get(min_idx);
                    int comparison = Double
                            .valueOf(d1.getTailLength())
                            .compareTo(d2.getTailLength());
                    if (comparison == 0) {
                        comparison = String
                                .valueOf(d1.getName())
                                .compareTo(d2.getName());
                    }
                    if (comparison < 0)
                        min_idx = j;
                }
    
                // Swap the found minimum element with the first
                // element
    
                // using built in swap
                // Collections.swap(dogs, min_idx, i);
    
                // using classic temp method
                Dog temp = dogs.get(min_idx);
                dogs.set(min_idx, dogs.get(i));
                dogs.set(i, temp);
    
                // using classic method without temp element
                // dogs.set(i, dogs.set(min_idx, dogs.get(i)));
            }
        }
    }
    

    这里也是一个repl,在实践中可以看到这个函数:https://repl.it/repls/VividMeekPlans

    【讨论】:

    • 有什么办法可以重写最后的Collections.swap(dogs, min_idx, i);?学校编译器对我们不使用完成的java方法非常严格。我尝试制作自己的方法,但没有任何代码符合.. int temp = dogs.get(i); dogs.set(i, dogs.get(j)); dogs.set(j, temp);
    • 我将 int temp 更改为 Dog temp 但随后出现编译问题,例如 线程“main”java.lang.IndexOutOfBoundsException 中的异常:索引 12 超出长度 12 的范围
    • 您可以使用以下代码执行此操作: Dog temp = dogs.get(min_idx); dog.set(min_idx, dogs.get(i)); dog.set(i, temp);我还用另一个示例更新了我上面评论中的代码。
    • 这真的很有帮助!!非常感谢:)
    猜你喜欢
    • 2011-07-19
    • 2012-02-18
    • 2016-11-14
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多