检查重复项并移动到下一个元素

时间:2015-09-27 04:36:09

标签: java

我有一个由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)];

2 个答案:

答案 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));