【问题标题】:using a java switch stament to determine what method to call and repeatedly calling that method使用 java switch 语句来确定调用什么方法并重复调用该方法
【发布时间】:2020-06-25 18:20:59
【问题描述】:

我正在编写一个 java 程序,用户可以在其中从列表中选择排序算法并指定要排序的数组的大小。然后程序会生成一个指定大小的随机整数数组,并使用带有 case 的 switch 语句为每个排序算法调用方法,以使用生成的数组作为参数来调用用户选择的算法。

我想更新我的代码以允许用户指定使用他们选择的算法对多少个数组进行排序。我想使用 for 循环来随机生成和排序数组,但这似乎并不理想,因为我必须:

  1. 将 switch 块放在 for 循环中,并在每个循环中检查它,即使每次都使用相同的排序算法。

  2. 在 switch 块中每个 case 都放置一个 for 循环,并以 for 循环的形式有很多重复的代码。

有没有比使用 switch 案例和 for 循环更好的实现方式?

【问题讨论】:

  • 请编辑您的问题以包含您已经尝试过的示例代码。
  • 嘿,伙计,我周末回来并稍微整理了下面的示例。你设法让你的程序按你想要的方式运行?

标签: java for-loop switch-statement


【解决方案1】:

我决定尝试根据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,

【讨论】:

    【解决方案2】:

    定义一个名为Sorter 的接口(甚至可能是一个函数接口),它有一个方法

    int [] sort( final int [] values )
    

    var sort( final int [] values )
    

    如果您对数组进行就地排序。

    为每个排序算法实现该接口。

    然后你可以在你的程序中有一个变量Sorter sorter来保存实现;它将根据用户选择在您的switch/case 语句中初始化。

    在您的for 循环中,您将为每个要排序的数组调用sorter.sort()

    您甚至可以通过创建Map&lt;String,Sorter&gt; 数据结构来避免switch/case 语句,该数据结构以排序算法的名称作为键和Sorter 的实现实例作为值进行初始化。如果Sorter 是一个函数式接口,您只需将各个sort() 方法的引用分配给Map

    然而,这被称为策略模式……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多