我是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]);
}
我如何修复这个代码,一个选定的团队永远不会再选择。 感谢您的任何帮助。
答案 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,它可以让你使用集合,列表和地图等工作,使这类任务变得更加容易和清晰。
许多编程课程似乎在收藏之前教授数组。坦率地说,我不同意这个选择,但这不是讨论的地方。