我有一个由String数组和String arraylist组成的简单程序。程序从数组中随机选择一个String,并检查该字符串是否也存在于arraylist中。如果是,则选择不同的String。现在该程序运行正常,但我不确定我的代码效率如何,因为我有两行同样的代码 - 我认为这是不好的做法。
`import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Main {
public static String[] rooms1 = new String[] {
"Library",
"Kitchen",
"Study",
"Conservatory",
"Ballroom",
"Lounge",
"Hall",
"Billiard Room",
"Dining Room"
};
public static List<String> rooms2 = new ArrayList<String>();
public static void addRooms() {
rooms2.add("Garage");
rooms2.add("Bar");
rooms2.add("Library");
rooms2.add("Bathroom");
rooms2.add("Lounge");
rooms2.add("Dining Room");
}
public static void main(String[] args) {
addRooms();
Random random = new Random();
String roomChosen = rooms1[random.nextInt(rooms1.length)];
while (rooms2.contains(roomChosen))
roomChosen = rooms1[random.nextInt(rooms1.length)];
System.out.println("Player has entered the " + roomChosen);
}
}
`
重复的代码行是roomChosen = rooms1[random.nextInt(rooms1.length)];
答案 0 :(得分:1)
使用相同的代码行运行两次并不总是效率问题,而是能够避免在代码中输入错误。您已经捕获了如何从这行代码中的数组中选择随机字符串的逻辑:
rooms1[random.nextInt(rooms1.length)]
当您关于如何完成此更改的逻辑时,问题就会发生。在您目前的情况下,您必须格外小心地找到此代码的每个实例并正确地更改它。
避免代码重复的一种方法是使用方法。您可以捕获关于如何在方法内部的数组中查找随机字符串的逻辑,然后您只需要将此代码保存在方法内,而不是其他任何地方。
以下代码可用作示例:
public static String getRandomStringFromRooms1() {
Random random = new Random();
return rooms1[random.nextInt(rooms1.length)];
}
public static void main(String[] args) {
addRooms();
String roomChosen = getRandomStringFromRooms1();
while (rooms2.contains(roomChosen))
roomChosen = getRandomStringFromRooms1();
System.out.println("Player has entered the " + roomChosen);
}
这个例子是;但是,效率低于您的代码,因为每次调用getRandomStringFromRooms1()
方法时,您都会创建一个全新的Random
对象。如果您不喜欢在每个方法调用中创建Random
对象的想法,因为您可能会调用此方法数百次,您可以创建一次Random
对象并将其传递给您的方法如下:
public static String getRandomStringFromRooms1(Random random) {
return rooms1[random.nextInt(rooms1.length)];
}
public static void main(String[] args) {
addRooms();
Random random = new Random();
String roomChosen = getRandomStringFromRooms1(random);
while (rooms2.contains(roomChosen))
roomChosen = getRandomStringFromRooms1(random);
System.out.println("Player has entered the " + roomChosen);
}
祝你好运。
答案 1 :(得分:0)
这对我来说并不是太糟糕。如果您认为重复相同的代码行看起来很丑,则可以使用do while循环。在效率方面,我不认为重复的代码行是一个真正的迹象,表明你的代码效率较低。我同意它看起来更丑陋而且更难理解。
为了提高效率,在这种情况下,只需放下while循环,只选择不在room2中的房间。这将是一行代码,而不是一个模糊的长时间循环。
String roomChosen = rooms1[random.nextInt(rooms1.length)];
while (rooms2.contains(roomChosen))
roomChosen = rooms1[random.nextInt(rooms1.length)];
将成为:
String roomChosen;
do {
roomChosen = rooms1[random.nextInt(rooms1.length)];
} while (rooms2.contains(roomChosen));