如何只获取一次数组元素

时间:2014-03-07 11:34:54

标签: java arrays

我是java中的新编程,我想学习在java中使用简单的数组对象。我的问题是如何尽可能简单地实现这一目标。 我有两个阵列,第一个是保留足球队,第二个是保持对队伍的预测。

for(int i = 0; i < 3; i++) {
    String [] team = {"Astonvilla", "Realmadrid", "Ajax", "Barcelona", "Manunited"};
    String [] result={"0","1","2"}; 

    int chooseTeam = (int)(Math.random()*team.length);
    int chooseResult = (int)(Math.random()*result.length);

    System.out.println("Team is " + team[chooseTeam] + " Result is " 
        + result[chooseResult]);
}

我如何修复这个代码,一个选定的团队永远不会再选择。 感谢您的任何帮助。

6 个答案:

答案 0 :(得分:3)

你应该使用一个布尔数组来存储以前检查过的元素,因为它的内存效率更高,而且(我认为)比使用int数组更具可读性。试试这个:

int size = 4; // set size here = size of your array 'team'
boolean[] used = new boolean[size]; // all elements are by default false
for(int i = 0; i < 3; i++) {
    String [] team = {"Astonvilla", "Realmadrid", "Ajax", "Barcelona", "Manunited"};
    String [] result={"0","1","2"}; 

    int chooseTeam;
    do //repeatedly generate random indexes until an index not selected previously has been found
    {
        chooseTeam = (int)(Math.random()*team.length); 
    } while(used[chooseTeam]);
    used[chooseTeam] = true;
    int chooseResult = (int)(Math.random() * result.length);
    System.out.println("Team is " + team[chooseTeam] + " Result is " + result[chooseResult]);
}

答案 1 :(得分:1)

制作另一个长度等于team长度的数组。

int check[] = new  int[team.length]; // by default all values are zero(0). If not then initialize all elements of this array with zero(0)

现在稍微改变你的for循环

for(int i = 0; i < 3; i++) {
    String [] team = {"Astonvilla", "Realmadrid", "Ajax", "Barcelona", "Manunited"};
    String [] result={"0","1","2"}; 

    int chooseTeam = (int)(Math.random()*team.length);
    int chooseResult = (int)(Math.random()*result.length);

    if(check[chooseTeam]==0){// check whether team has been chosen or not. (0 means not chosen)
         System.out.println("Team is " + team[chooseTeam] + " Result is " 
         + result[chooseResult]);
       check[chooseTeam]=1;// once the team is chosen then make that check element to 1(mens chosen) 
     }
}

答案 2 :(得分:0)

您可以使用teamList,这样您就可以在选中后删除该小组。

List<String> teamlist = new ArrayList<String>();
        teamlist.add("Astonvilla");
        teamlist.add("Realmadrid");
        teamlist.add("Ajax");
        teamlist.add("Barcelona");
        teamlist.add("Manunited");
        String [] result={"0","1","2"}; 

        for(int i = 0; i < 3; i++) {
            int chooseTeam = (int)(Math.random()*teamlist.size());
            int chooseResult = (int)(Math.random()*result.length);

            System.out.println("Team is " + teamlist.get(chooseTeam) + " Result is " 
                + result[chooseResult]);
            teamlist.remove(chooseTeam);
        }
    }

答案 3 :(得分:0)

首先想法,使用ArrayList并在选择时删除团队:

ArrayList<String> team = new ArrayList<String>();
team.add("Astonvilla");
team.add("Realmadrid");
team.add("Ajax");
team.add("Barcelona");
team.add("Manunited");
String [] result={"0","1","2"}; 
for(int i = 0; i < 3; i++) {
    int chooseTeam = (int)(Math.random()*team.size());
    int chooseResult = (int)(Math.random()*result.length);

    System.out.println("Team is " + team.get(chooseTeam) + " Result is " 
        + result[chooseResult]);
    team.remove(chooseTeam);
}

第二个想法,将团队放在数组的末尾,并从可能的选择中排除数组的结尾:

String [] team = {"Astonvilla", "Realmadrid", "Ajax", "Barcelona", "Manunited"};
for(int i = 0; i < 3; i++) {
    String [] result={"0","1","2"}; 

    int chooseTeam = (int)(Math.random()*(team.length-i));
    int chooseResult = (int)(Math.random()*result.length);

    System.out.println("Team is " + team[chooseTeam] + " Result is " 
        + result[chooseResult]);
    String teamName = team[team.length-1];
    team[team.length-1] = team[chooseTeam];
    team[chooseTeam] = teamName;
}

第三个想法,保留你已经选择的数字,如果你再次得到它们,那就做一个新的随机数:

HashSet<Integer> alreadyUsed = new HashSet<Integer>();
for(int i = 0; i < 3; i++) {
    String [] team = {"Astonvilla", "Realmadrid", "Ajax", "Barcelona", "Manunited"};
    String [] result={"0","1","2"}; 

    int chooseTeam;
    do {
        chooseTeam = (int)(Math.random()*team.length);
    } while (alreadyUsed.contains(chooseTeam));
    alreadyUsed.add(chooseTeam);

    int chooseResult = (int)(Math.random()*result.length);

    System.out.println("Team is " + team[chooseTeam] + " Result is " 
        + result[chooseResult]);
}

答案 4 :(得分:0)

你需要在顶部的某个arraylist中维持选择团队,并检查如果选择的团队再次选择,那么你将再次重试,直到你获得未选择的团队

答案 5 :(得分:0)

您可以采取一些方法。

保留以前选择的球队的记录

您可以保留另一个阵列,其中列出了之前选择过的球队。当你选择一个随机团队时,你可以在一个循环中完成它,如果你选择了之前选择过的团队,那就再试一次。

 chosenTeams = new boolean[team.length];

 ...

 chosenTeam = Math.random() * team.length;
 while(chosenTeams[chosenTeam] == true) {
    chosenTeam = Math.random() * team.length;
 }
 chosenTeams[chosenTeam] = true;
 ...

的问题在于,您已经选择的团队越多,您的循环就越有可能浪费时间一遍又一遍地选择已经使用过的团队。

所以你可以变得更聪明,而不是选择另一个随机数,而是选择下一个可用的团队。也就是说,如果我选择1(皇家马德里队)然后再选1,我会尝试2,3,4,0 ......直到我找到一支不属于我所选队伍的队伍。

 chosenTeam = Math.random() * team.length;
 while(chosenTeams[chosenTeam] == true) {
    chosenTeam = (chosenTeam + 1) % team.length;
 }
 chosenTeams[chosenTeam] = true;
 ...

这种方法仍然存在问题 - 搜索所选团队列表需要时间。像你这样的短名单不是问题,但如果有数千或数百万的条目,那将成为一个大问题。我在下面描述的方法解决了这个问题;但是稍后您将学习数据结构,这些数据结构可以让您比逐个循环遍历数组更快地进行搜索。

一旦您选择了团队,就从阵列中删除该团队

 String team = team[chooseTeam];
 team[chooseTeam] = null;

现在您不必维护第二个数组就可以看到已经选择了。您仍然可以使用相同的方法来处理找到空团队。如果我选择2并且它为空,我可以尝试3,然后是4,然后是0,直到我发现非空或我已经尝试过整个数组。

 while(team[chooseTeam] == null) {
     chooseTeam = (chooseTeam + 1) % team.length
 }

从阵列中删除团队,并压缩阵列

如果我选择第2项然后将其取消,那么填补空洞会很有用。您可以将数组中的最后一项移动到间隙 - 这涉及保持变量以记住哪个索引是最后一个:

 String team = team[chosenTeam];
 team[chosenTeam] = team[lastIndex]
 lastIndex = lastIndex - 1;

...或者您可以将所有数组项目向下移动,因此3移动到2,4移动到3等等。查看System.arraycopy()以获得有效的方法。你仍然需要保留lastIndex变量,因为无论你做什么,每次选择时都需要在0和lastIndex之间选择一个随机数。

注意

在你学习的时候做这种事是一个很好的练习。但请注意,一旦你继续进行“真正的”Java编程,你应该使用Java的Collections API,它可以让你使用集合,列表和地图等工作,使这类任务变得更加容易和清晰。

许多编程课程似乎在收藏之前教授数组。坦率地说,我不同意这个选择,但这不是讨论的地方。