【问题标题】:Mergesort, search by method合并排序,按方法搜索
【发布时间】:2020-06-20 06:38:22
【问题描述】:

我有一个包含 3 种方法的类 - model(getModel)、mark(getMark) 和 color(getColor)。

全部作为对象保存在 ArrayList 中。 我尝试通过实现 MergeSort 对其进行排序。 调用对象后,默认按照类中的第一个字段进行排序。如何指示要排序的对象的字段?

主要:

import java.util.ArrayList;
import java.util.List;

public class OnlyTest {
    public static void main(String[] args) {
        List<Car> carList = new ArrayList<>();
        carList.add(new Car("BMW", "X1", "ORANGE"));
        carList.add(new Car("Audi", "A6", "BLACK"));
        carList.add(new Car("Seat", "Ibiza", "GREEN"));
        carList.add(new Car("Skoda", "Fabia", "WHITE"));

        MergeSort ms = new MergeSort(carList); //getMark
        ms.sort();
        ms.show();
    }
}

合并排序:

import java.util.ArrayList;
import java.util.List;
public class MergeSort {
    private List strList;
    public MergeSort(List<Car> input) {
        strList = input;
    }

    public void sort() {
        strList = mergeSort(strList);
    }

    List<Car> mergeSort(List<Car> whole) {
        List<Car> left = new ArrayList<>();
        List<Car> right = new ArrayList<>();
        int center;

        if (whole.size() == 1) {    
            return whole;
        } else {
            center = whole.size() / 2;
            for (int i = 0; i < center; i++) {
                left.add(whole.get(i));
            }
            for (int i = center; i < whole.size(); i++) {
                right.add(whole.get(i));
            }

            left  = mergeSort(left);
            right = mergeSort(right);
            merge(left, right, whole);
        }
        return whole;
    }

    private void merge(List<Car> left, List<Car> right, List<Car> whole) {
        int leftIndex = 0;
        int rightIndex = 0;
        int wholeIndex = 0;
        while (leftIndex < left.size() && rightIndex < right.size()) {
            if ((String.valueOf(left.get(leftIndex)).compareTo(String.valueOf(right.get(rightIndex)))) < 0) {
                whole.set(wholeIndex, left.get(leftIndex));
                leftIndex++;
            } else {
                whole.set(wholeIndex, right.get(rightIndex));
                rightIndex++;
            }
            wholeIndex++;
        }

        List<Car> rest;
        int restIndex;
        if (leftIndex >= left.size()) {
            rest = right;
            restIndex = rightIndex;
        } else {
            rest = left;
            restIndex = leftIndex;
        }

        for (int i = restIndex; i < rest.size(); i++) {
            whole.set(wholeIndex, rest.get(i));
            wholeIndex++;
        }
    }

    public void show() {
        for (int i = 0; i < strList.size(); i++) {
            System.out.println(strList.get(i));
        }
    }
}

【问题讨论】:

    标签: java sorting arraylist methods mergesort


    【解决方案1】:

    我认为您必须专门选择要比较的字段。例如。要根据颜色进行排序,您可以在left.get(leftIndex).color() 中指定颜色

    while (leftIndex < left.size() && rightIndex < right.size()) {
            if ((String.valueOf(left.get(leftIndex).color()).compareTo(String.valueOf(right.get(rightIndex).color()))) < 0) {
                whole.set(wholeIndex, left.get(leftIndex));
                leftIndex++;
            } 
    

    【讨论】:

      【解决方案2】:

      我认为您可以为此使用内置方法。 e. g.Collections.sort()

      首先创建一个自定义比较器类:

      import java.util.Comparator;
      
      public class CustomComperator implements Comparator<Car> {
      
         public int compare(Car f1, Car f2) {
             return f1.color().compareTo(f2.color());
         }
      }
      

      现在你在测试课上做以下事情

      import java.util.ArrayList;
      import java.util.Collections;
      
      
      public class OnlyTest {
        public static void main(String[] args) {
          ArrayList<Car> carList = new ArrayList<>();
          carList.add(new Car("BMW", "X1", "ORANGE"));
          carList.add(new Car("Audi", "A6", "BLACK"));
          carList.add(new Car("Seat", "Ibiza", "GREEN"));
          carList.add(new Car("Skoda", "Fabia", "WHITE"));
          Collections.sort(carList, new CustomComperator());
          ms.show(carList)
      
         }
      }
      

      如果您想从头开始实现自己的归并排序,您可以遵循 java 泛型。它将使您的代码简单且可重用。

      【讨论】:

        猜你喜欢
        • 2020-11-05
        • 1970-01-01
        • 1970-01-01
        • 2010-09-25
        • 1970-01-01
        • 1970-01-01
        • 2013-02-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多