Java从数组中配对名称

时间:2018-04-17 18:20:31

标签: java

所以我试图创建一个小型Java程序,其中数组中的名称是成对的。但我不知道该怎么办。我有名字的数组,对象是随机配对两个名字组成一个团队。应该有一些声明,所以无法做出某些对:Miller&詹姆斯不能在同一个团队中,也不能在同一个团体中。我该怎么做?

示例输出: 詹姆斯&哈尔

import java.util.Random;

public class Teams {

    public static void main (String [] args) {

        String [] arr = {"John", "James", "George", "Miller", "Hal", "Dan"};
        Random random = new Random();

         int select = random.nextInt(arr.length); 
         int selectSecond = random.nextInt(arr.length);

         System.out.println(arr[select]);
         System.out.println(arr[selectSecond]);      

         }
}

3 个答案:

答案 0 :(得分:0)

我想改用Collections.shuffle,并使用do while循环:

String[] arr = {"John", "James", "George", "Miller", "Hal", "Dan"};
List<String> list = Arrays.asList(arr);
String name1, name2;
do {
    Collections.shuffle(list);
    name1 = list.get(0);
    name2 = list.get(1);
} while ((name2.equals("Miller") && name1.equals("James"))
        || (name1.equals("James") && name2.equals("Miller")));

System.out.println(String.format("%s & %s", name1, name2));

使用此解决方案,您无需检查两个名称是否相同,您只需要检查两个名称在同一对中是否不等于Miller and James

答案 1 :(得分:0)

您可以从数组中删除第一个选择的名称,然后再次选择以获取第二个名称。要从数组中删除元素,请参阅Removing an element from an Array (Java)。这是一个可能的实现(但我没有测试它):

public static void main (String [] args) {

    String [] arr = {"John", "James", "George", "Miller", "Hal", "Dan"};
    Random random = new Random();

    int select = random.nextInt(arr.length);
    arr = removeElements(arr, arr[select]);
    int selectSecond = random.nextInt(arr.length);

    System.out.println(arr[select]);
    System.out.println(arr[selectSecond]);

}

// import java.util.LinkedList;
public static String[] removeElements(String[] input, String deleteMe) {
    List result = new LinkedList();

    for(String item : input)
        if(!deleteMe.equals(item))
            result.add(item);

    return (String[]) result.toArray(input);
}

答案 2 :(得分:0)

这取决于你想在哪个角度进行攻击。如果你只是想做这份工作&#34;,你就有了大量的可能性(正如我们已经有过的那样),但我会注意可读性:

public class Teams {

    private static String[][] teamsToAvoid = {{"James", "Miller"}, {"John", "Hal"}};
    private static String[][] teamsFormed = new String[3][2];

    public static void main(String[] args){
        String[] names = {"John", "James", "George", "Miller", "Hal", "Dan"};
        List<String> namesList = new ArrayList<>(Arrays.asList(names));
        Collections.shuffle(namesList);

        do {
            formTeam(namesList, 0, 1);
        } while(namesList != null && !namesList.isEmpty());

        for(String[] team : teamsFormed){
            System.out.println("Team: {" + team[0] + ", " + team[1] + "}");
        }
    }

    private static void formTeam(List<String> namesList, int firstPlayerIndex, int secondPlayerIndex) {
        if(isTeamPossible(namesList.get(firstPlayerIndex), namesList.get(secondPlayerIndex))){
            String firstPlayer = namesList.get(firstPlayerIndex);
            String secondPlayer = namesList.get(secondPlayerIndex);
            teamsFormed[getFormedTeamNextIndex()] = new String[]{firstPlayer, secondPlayer};
            namesList.remove(namesList.indexOf(firstPlayer));
            namesList.remove(namesList.indexOf(secondPlayer));
        } else {
            formTeam(namesList, firstPlayerIndex, ++secondPlayerIndex);
        }
    }

    private static boolean isTeamPossible(String player1, String player2) {
        for(String[] teamToAvoid : teamsToAvoid){
            if(Arrays.asList(teamToAvoid).contains(player1) && Arrays.asList(teamToAvoid).contains(player2)){
                return false;
            }
        }
        return true;
    }

    private static int getFormedTeamNextIndex() {
        for(int i = 0; i < teamsFormed.length; i++){
            if(teamsFormed[i][0] == null && teamsFormed[i][1] == null)
                return i;
        }
        return 0;
    }
}

执行此操作,您将以不同的顺序阻止同一对,并从列表中删除这些玩家(防止其重复使用)。

我也会在通过索引直接从列表中删除时注意,因为当你删除一个项目之后的项目索引更改。