英文:
How should I reduce repetitive code that are all the same but run different functions?
问题
你可以通过创建一个方法,该方法接受一个算法作为参数,然后在不同的循环中调用该方法,并将不同的算法传递给它。这将减少代码的重复性。以下是示例代码:
// 创建一个方法,接受算法作为参数,并返回平均时间
public static long runAlgorithm(YourClass x, int[] randomArray, int algorithmIndex) {
    long total = 0;
    for (int j = 0; j < 5000; j++) {
        if (algorithmIndex == 1) {
            x.algorithm1(randomArray[algorithmIndex]);
        } else if (algorithmIndex == 2) {
            x.algorithm2(randomArray[algorithmIndex]);
        } // 可以根据需要添加更多算法
        long t2 = System.nanoTime();
        long elapsed = t2 - t1;
        total += elapsed;
    }
    return total / 5000;
}
// 在循环中调用方法,并将不同的算法索引传递给它
for (int i = 0; i < 19; i++) {
    long t1 = System.nanoTime();
    matrix[i][0] = runAlgorithm(x, randomArray, 1); // 调用算法1
}
// 在另一个循环中调用方法,传递不同的算法索引
for (int i = 0; i < 19; i++) {
    long t1 = System.nanoTime();
    matrix[i][1] = runAlgorithm(x, randomArray, 2); // 调用算法2
}
// 可以继续在其他循环中调用方法,传递不同的算法索引
通过这种方式,你可以避免重复的代码,并轻松更改要调用的算法。你只需要更新 runAlgorithm 方法的条件语句来处理更多的算法选项。
英文:
  for (int i = 0; i < 19; i++) {
         long t1 = System.nanoTime();
         long total = 0;
         for (int j = 0; j < 5000; j++) {
            x.algorithm1(randomArray[i]);
            long t2 = System.nanoTime();
            long elapsed = t2 - t1;
            total += elapsed;
         }
         long averageTime = 0;
         averageTime= total / 5000;
         matrix[i][0] = averageTime;
      }
  /* Running Algorithm 2 */
  for (int i = 0; i < 19; i++) {
     long t1 = System.nanoTime();
     long total = 0;
     for (int j = 0; j < 5000; j++) {
        x.algorithm2(randomArray[i]);
        long t2 = System.nanoTime();
        long elapsed = t2 - t1;
        total += elapsed;
     }
     long averageTime = 0;
     averageTime = total / 5000;
     matrix[i][1] = averageTime;
  } 
I have 3 of these for loops that basically do the same thing however the line "x.algorithm2(randomArray[i]);" changes to a different algorithm in each different for loop. How can I reduce this repetitive code to only change the algorithm being called?
答案1
得分: 1
这里是使用函数式接口和泛型的示例代码:
public static <T> void runAlgorithm(long[][] matrix, Consumer<T> tConsumer, T[] tArray) {
    for (int i = 0; i < 19; i++) {
        long t1 = System.nanoTime();
        long total = 0;
        for (int j = 0; j < 5000; j++) {
            tConsumer.accept(tArray[i]);
            long t2 = System.nanoTime();
            long elapsed = t2 - t1;
            total += elapsed;
        }
        long averageTime = total / 5000;
        matrix[i][1] = averageTime;
    }
}
public static void main(String[] args) {
    long[][] matrix1 = null; // ???
    Integer[] randomInts = new Integer[] {}; // ???
    runAlgorithm(matrix1, Algorithms::algorithmOnInts, randomInts);
    long[][] matrix2 = null; // ???
    Object[] randomObjects = new Object[] {}; // ???
    runAlgorithm(matrix2, Algorithms::algorithmOnObjects, randomObjects);
}
public static class Algorithms {
    public static void algorithmOnInts(Integer i) {}
    public static void algorithmOnObjects(Object o) {}
}
注意:这里的 ??? 部分是示例代码中的占位符,需要您根据实际情况填写相应的内容。
英文:
Here's an example of what you could do using functional interfaces and generics:
public static <T> void runAlgorithm(long[][] matrix, Consumer<T> tConsumer, T[] tArray) {
	for (int i = 0; i < 19; i++) {
		long t1 = System.nanoTime();
		long total = 0;
		for (int j = 0; j < 5000; j++) {
			tConsumer.accept(tArray[i]);
			long t2 = System.nanoTime();
			long elapsed = t2 - t1;
			total += elapsed;
		}
		long averageTime = 0;
		averageTime = total / 5000;
		matrix[i][1] = averageTime;
	}
}
public static void main(String[] args) {
	long[][] matrix1 = null; // ???
	Integer[] randomInts = new Integer[] {}; // ???
    runAlgorithm(matrix1, Algorithms::algorithmOnInts, randomInts);
    long[][] matrix2 = null; // ???
	Object[] randomObjects = new Object[] {}; // ???
	runAlgorithm(matrix2, Algorithms::algorithmOnObjects, randomObjects);
}
public static class Algorithms {
	public static void algorithmOnInts(Integer i) {}
	public static void algorithmOnObjects(Object o) {}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论