Mergesort, поиск по методу - PullRequest
       4

Mergesort, поиск по методу

1 голос
/ 08 марта 2020

У меня есть класс с 3 методами - модель (getModel), метка (getMark) и цвет (getColor).

Все это сохраняется как объект в ArrayList. Я пытаюсь отсортировать его путем реализации MergeSort. После вызова объекта он сортируется по умолчанию в соответствии с первым полем в классе. Как указать поле сортируемого объекта?

main:

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();
    }
}

MergeSort:

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));
        }
    }
}

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Я думаю, вам нужно специально выбрать поле, которое вы хотите сравнить. Например для сортировки по цвету вы можете указать цвет в 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++;
        } 
0 голосов
/ 10 марта 2020

Я думаю, вы можете использовать встроенный метод для этого. эл. 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 Generics. Это сделает ваш код простым и пригодным для повторного использования.

...