с помощью переключателя java для определения, какой метод вызывать, и повторного вызова этого метода - PullRequest
0 голосов
/ 13 марта 2020

Я пишу java программу, в которой пользователь может выбрать алгоритм сортировки из списка и указать размер сортируемого массива. Затем программа генерирует массив указанного размера, заполненный случайными целыми числами, и использует оператор switch с регистром для каждого алгоритма сортировки, чтобы вызвать метод для выбранного пользователем алгоритма, используя сгенерированный массив в качестве параметра.

I хочу обновить мой код, чтобы пользователь мог указать, сколько массивов нужно отсортировать по выбранному алгоритму. Я хочу использовать для l oop случайную генерацию и сортировку массивов, однако это не кажется идеальным, потому что мне придется либо:

  1. Поместить блок переключателей внутри для l oop и проверяйте его каждые l oop, хотя каждый раз будет использоваться один и тот же алгоритм сортировки.

  2. Поместите a для l oop в каждом случае в коммутаторе блокировать и иметь много повторяющегося кода в виде циклов for.

Есть ли лучшая реализация для этого, чем использование переключателей и циклов for?

Ответы [ 2 ]

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

Я решил попробовать собрать пример того, как вы могли бы go об этом, основываясь на идее tquadrat об использовании функционального интерфейса. Надеюсь, это поможет!

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

public class Sorting {

  @FunctionalInterface
  interface SortType {
    Integer[] sort(Integer[] array);
  }

  public static void main(String[] args) {
    int numArrays = 5;
    int numValues = 10;

    ArrayList<Integer[]> unsortedArrays = generateArrays(numArrays, numValues);
    System.out.println("Unsorted:");
    print(unsortedArrays);

    ArrayList<Integer[]> sortedArrays = sortArrays(unsortedArrays, Sorting::bubbleSort);
    System.out.println("\nSorted:");
    print(sortedArrays);
  }

  //Put together random values
  private static ArrayList<Integer[]> generateArrays(int numArrays, int numValues) {
    ArrayList<Integer[]> unsortedArrays = new ArrayList<>();
    Random rand = new Random();

    for (int i = 0; i < numArrays; i++) {
      Integer[] array = new Integer[numValues];
      for (int j = 0; j < numValues; j++) {
        array[j] = rand.nextInt(100);
      }
      unsortedArrays.add(array);
    }

    return unsortedArrays;
  }

  //Loop through using the given sorting method on each array
  private static ArrayList<Integer[]> sortArrays(ArrayList<Integer[]> arrays, SortType sortType) {
    ArrayList<Integer[]> sortedArrays = new ArrayList<>();
    for (Integer[] array : arrays) {
      sortedArrays.add(sortType.sort(array));
    }
    return sortedArrays;
  }

  //Example sort to use with parameters and return matching the interface
  private static Integer[] bubbleSort(Integer[] array) {
    int n = array.length;
    for (int i = 0; i < n - 1; i++)
      for (int j = 0; j < n - i - 1; j++)
        if (array[j] > array[j + 1]) {
          int temp = array[j];
          array[j] = array[j + 1];
          array[j + 1] = temp;
        }
    return array;
  }

  //Method to print the results
  private static void print(ArrayList<Integer[]> arrays) {
    for (Integer[] array : arrays) {
      for (Integer i : array)
        System.out.print(i + ", ");
      System.out.println();
    }
  }

}

Пример вывода:

Unsorted:
67, 54, 83, 67, 62, 96, 6, 24, 66, 19, 
3, 37, 45, 36, 81, 45, 5, 46, 5, 84, 
10, 8, 95, 50, 82, 38, 36, 18, 80, 98, 
52, 27, 18, 17, 77, 51, 18, 72, 55, 76, 
79, 84, 92, 85, 61, 74, 64, 29, 95, 64, 

Sorted:
6, 19, 24, 54, 62, 66, 67, 67, 83, 96, 
3, 5, 5, 36, 37, 45, 45, 46, 81, 84, 
8, 10, 18, 36, 38, 50, 80, 82, 95, 98, 
17, 18, 18, 27, 51, 52, 55, 72, 76, 77, 
29, 61, 64, 64, 74, 79, 84, 85, 92, 95,
1 голос
/ 13 марта 2020

Определите интерфейс (возможно, даже функциональный интерфейс) с именем Sorter, который имеет метод

int [] sort( final int [] values )

или

var sort( final int [] values )

, если вы сортируете массив на месте.

Реализация этого интерфейса для каждого алгоритма сортировки.

Тогда в вашей программе может быть переменная Sorter sorter, которая содержит реализацию; он будет инициализирован в вашем операторе switch/case на основе выбора пользователя.

В вашем for l oop вы будете вызывать sorter.sort() для каждого сортируемого массива.

Вы даже можете избежать оператора switch/case, создав структуру данных Map<String,Sorter>, которая инициализируется с именем алгоритма сортировки в качестве ключа и экземплярами реализации Sorter в качестве значения. Если Sorter является функциональным интерфейсом, вы можете просто назначить ссылку на соответствующие sort() методы для Map.

Однако это известно как шаблон Strategy

...