Java 如何从阵列中删除重复项?
我试图使其成为这样,在方法中,随着填充数组的增加,它会检查上面的索引值是否相同。然而,我不知道如何在不逐个检查每个索引的情况下做到这一点,这使得它效率非常低。我试着做一个for循环,其中I值为0,增加1,在for循环内是另一个for循环,b值为1,也增加1。在第二个for循环中,我有一个if语句,如果I索引等于b索引,则I索引将再次重新评估Java 如何从阵列中删除重复项?,java,arrays,duplicates,Java,Arrays,Duplicates,我试图使其成为这样,在方法中,随着填充数组的增加,它会检查上面的索引值是否相同。然而,我不知道如何在不逐个检查每个索引的情况下做到这一点,这使得它效率非常低。我试着做一个for循环,其中I值为0,增加1,在for循环内是另一个for循环,b值为1,也增加1。在第二个for循环中,我有一个if语句,如果I索引等于b索引,则I索引将再次重新评估 public class CH7Ass { public static void main(String[] args) { in
public class CH7Ass {
public static void main(String[] args) {
int user;
int[] array;
int checkUserNum;
int tries=0;
System.out.println("I bet you can't guess my six numbers");
array=populate();
do{
tries++;
user=getUserNum();
checkUserNum=checkUserNum(user,array);
array=removeFromArray(array,checkUserNum);
}while(tries<6);
}
public static int[] populate(){
int[] populate;
populate= new int [6];
int random;
for(int i=0;i<populate.length;i++){
random=(int) ((Math.random())*50); //goes from 0-49
populate[i]=random;
System.out.println(populate[i]);
for(int b=1;b<populate.length;b++){
if(populate[b]==populate[i]){
populate[i]=random;
}
}
}
return populate;
}
public static int getUserNum(){
int getUserNum;
do{
System.out.println("Please input a number from 1 to 49:");
getUserNum=TextIO.getInt();
}while((getUserNum<1)||(getUserNum>49));
return getUserNum;
}
public static int checkUserNum(int getUserNum,int[] array){
boolean check=false;
int checkUserNum = 0;
for(int i=0;i<array.length;i++){
if(array[i]==getUserNum){
check=true;
System.out.println("You got it");
checkUserNum=i;
}
}
if(check==false){
checkUserNum=-1;
System.out.println(checkUserNum);
}
return checkUserNum;
}
private static int[] removeFromArray(int[] array,int checkUserNum){
int[] removeFromArray;
if(checkUserNum!=-1){
array[checkUserNum]=0;
removeFromArray=array[checkUserNum];
}
return removeFromArray;
}
}
公共类CH7Ass{
公共静态void main(字符串[]args){
int用户;
int[]数组;
int checkUserNum;
int=0;
System.out.println(“我打赌你猜不出我的六个数字”);
数组=填充();
做{
尝试++;
user=getUserNum();
checkUserNum=checkUserNum(用户,数组);
array=removeFromArray(array,checkUserNum);
}虽然(尝试我绝对不是算法专家,但我认为一个简单且易于实现的修改可以是以下内容
在算法的每次迭代中,您可以在b=1
处启动内环,而不是在b=i+1
处启动内环。这将产生一个等效的结果,因为如果您在外环的索引i处,您已经将所有小于i的索引与数组的其余部分进行了比较。您可以通过设置这样做me最小最大值随着for循环的工作而增加。这样,您可以为随机数设置边界,并强制它们位于不同的边界内
public static int[] populate(){
int[] populate = new int [6];
int random = 0;
double maximum = 0.0;
for(int i=0;i<populate.length;i++){
maximum += ( 50 / 6 );
random = ( Math.random() * ( maximum - (8 * i ) ) + (8 * i ) ) ;
populate[i] = random;
}
return populate;
}
publicstaticint[]populate(){
int[]填充=新int[6];
int随机=0;
双倍最大值=0.0;
对于(int i=0;i考虑重写您的描述。如果random==populate[b]==populate[i]?我将重新考虑您使用数组的方式。提示:想想hashtable数据结构。在populate()中,内部for循环完全不起作用。populate[i]在循环之前已被随机分配。我猜您是错分配了。@dbustosp我只编写了大约6个月的代码,所以我不知道这是什么,但我仍然感谢您的评论。@Shiping重新分配不意味着如果填充[b]等于填充[I],它将被重新分配另一个随机值吗好吧,假设我们有{1,2,2,4,6,7}如果索引[1]被随机分配到1,4,6,7中的任何一个,会怎么样?我已经在这个问题上停留了一段时间,每当我认为我有它时,我就会再次跌入困境。