在Java中,如何在特定日期生成随机名称?

在Java中,如何在特定日期生成随机名称?,java,arrays,Java,Arrays,这是我生成随机名称的程序: String[] names = new String[]{"one","two","three","four","five"}; Random rd = new Random(); int x = rd.nextInt(names.length); 我需要它根据上周末的检查生成名称,如果生成的名称与上周末生成的名称匹配,那么程序将再次运行以生成不同的名称。 例

这是我生成随机名称的程序:

 String[] names = new String[]{"one","two","three","four","five"};
 Random rd = new Random();
 int x = rd.nextInt(names.length);
我需要它根据上周末的检查生成名称,如果生成的名称与上周末生成的名称匹配,那么程序将再次运行以生成不同的名称。 例:如果“一”在周六生成,“二”在周日生成,那么下周这两个应该被排除在生成之外。
如何在Java中进行该检查?

您可以通过运行while循环,直到生成的字符串与不需要的字符串不匹配

例如:

String[] names = new String[]{"one", "two", "three", "four", "five"};
String[] lastWeekend = new String[]{"one", "three"}; // you should get these from somewhere else

Random rd = new Random();

int x = rd.nextInt(names.length);

// using a list for convenience
while(Arrays.asList(lastWeekend).contains(names[x]))
{
    x = rd.nextInt(names.length);
}

// names[x] will now be "two", "four" or "five"

您可以通过运行while循环来实现这一点,直到生成的字符串与不需要的字符串不匹配

例如:

String[] names = new String[]{"one", "two", "three", "four", "five"};
String[] lastWeekend = new String[]{"one", "three"}; // you should get these from somewhere else

Random rd = new Random();

int x = rd.nextInt(names.length);

// using a list for convenience
while(Arrays.asList(lastWeekend).contains(names[x]))
{
    x = rd.nextInt(names.length);
}

// names[x] will now be "two", "four" or "five"
我需要它根据上周末生成名称检查,如果生成的名称与上周末生成的名称匹配,那么程序将再次运行以生成不同的名称

如果这对你不起作用,它可能会给你一些想法

  • 随机选择两个名称作为周末名称
  • 将这些名称从将来的使用中删除
  • 下次,从可用列表中选择新名称
  • 把旧名字加回去
  • 并更新当前使用的名称
现在,当打印当前使用的名称时,两个名称将出现在相邻的行中

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class WeekEndCheck {
    
    List<String> lastWeekendNames = new ArrayList<>();
    List<String> availableNames = new LinkedList<>(
        Arrays.asList("one", "two", "three", "four", "five"));
    
    public static void main(String[] args) {
        new WeekEndCheck().start();
    }
    
    public void start() {
        // do it for 10 weekends, not two names should
        // appear adjacent to each other
        for (int i = 0; i < 10; i++) {
            setWeekEndNames();
            System.out.println("Weekend " + (i+1) + " " + lastWeekendNames);
        }
    }
    
    Random r = new Random();
    
    public void setWeekEndNames() {
        List<String> temp = new ArrayList<>();
        for (int i = 0; i < 2; i++) {
            int indx = r.nextInt(availableNames.size());
            temp.add(availableNames.remove(indx));
        }
        availableNames.addAll(lastWeekendNames);
        lastWeekendNames.clear();
        lastWeekendNames.addAll(temp);
    }
}
更新

为了允许在周六和周日使用相同的名称,但在下一个周末不使用相同的名称,这应该是可行的。它与另一个类似,只是:

  • 选择名称后,将保存索引并有条件地删除索引
  • 如果两个索引相同,则只删除一个名称,因此无法在下一个周末使用
  • 否则,要保持列表同步,请先删除较大的索引号,然后删除较小的索引号。否则,可能会删除错误的文件或引发异常
public void setWeekEndNames(){
List temp=new ArrayList();
int[]索引=新的int[2];
对于(int i=0;i<2;i++){
索引[i]=r.nextInt(availableNames.size());
临时添加(可用名称获取(索引[i]);
}
如果(索引[0]==索引[1]){
删除(索引[0]);
}否则{
移除(Math.max(索引[0],索引[1]);
移除(Math.min(索引[0],索引[1]);
}
availableNames.addAll(lastWeekendNames);
lastWeekendNames.clear();
最后一周名称添加所有(临时);
}
我需要它根据上周末生成名称检查,如果生成的名称与上周末生成的名称匹配,那么程序将再次运行以生成不同的名称

如果这对你不起作用,它可能会给你一些想法

  • 随机选择两个名称作为周末名称
  • 将这些名称从将来的使用中删除
  • 下次,从可用列表中选择新名称
  • 把旧名字加回去
  • 并更新当前使用的名称
现在,当打印当前使用的名称时,两个名称将出现在相邻的行中

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class WeekEndCheck {
    
    List<String> lastWeekendNames = new ArrayList<>();
    List<String> availableNames = new LinkedList<>(
        Arrays.asList("one", "two", "three", "four", "five"));
    
    public static void main(String[] args) {
        new WeekEndCheck().start();
    }
    
    public void start() {
        // do it for 10 weekends, not two names should
        // appear adjacent to each other
        for (int i = 0; i < 10; i++) {
            setWeekEndNames();
            System.out.println("Weekend " + (i+1) + " " + lastWeekendNames);
        }
    }
    
    Random r = new Random();
    
    public void setWeekEndNames() {
        List<String> temp = new ArrayList<>();
        for (int i = 0; i < 2; i++) {
            int indx = r.nextInt(availableNames.size());
            temp.add(availableNames.remove(indx));
        }
        availableNames.addAll(lastWeekendNames);
        lastWeekendNames.clear();
        lastWeekendNames.addAll(temp);
    }
}
更新

为了允许在周六和周日使用相同的名称,但在下一个周末不使用相同的名称,这应该是可行的。它与另一个类似,只是:

  • 选择名称后,将保存索引并有条件地删除索引
  • 如果两个索引相同,则只删除一个名称,因此无法在下一个周末使用
  • 否则,要保持列表同步,请先删除较大的索引号,然后删除较小的索引号。否则,可能会删除错误的文件或引发异常
public void setWeekEndNames(){
List temp=new ArrayList();
int[]索引=新的int[2];
对于(int i=0;i<2;i++){
索引[i]=r.nextInt(availableNames.size());
临时添加(可用名称获取(索引[i]);
}
如果(索引[0]==索引[1]){
删除(索引[0]);
}否则{
移除(Math.max(索引[0],索引[1]);
移除(Math.min(索引[0],索引[1]);
}
availableNames.addAll(lastWeekendNames);
lastWeekendNames.clear();
最后一周名称添加所有(临时);
}

存储上周末选择的名称,当您为本周末选择时,对照这些值使用HashMap将以前生成的名称存储为值,键存储为天。检查该映射以生成随机名称。@ASAkram,取决于OP所说的“本周末”和“上周末”,OP似乎希望程序的后续执行记住之前执行所生成的内容。他们需要一个文件或数据库来完成这项工作。@SolomonSlow是的,我想是的。可能他/她想检查所有可能的组合,在这种情况下,这个答案会有所帮助。存储上周末选择的名称,当您选择本周末时,对照这些值检查使用HashMap将以前生成的名称存储为值,键存储为天。检查该映射以生成随机名称。@ASAkram,取决于OP所说的“本周末”和“上周末”,OP似乎希望程序的后续执行记住之前执行所生成的内容。他们需要一个文件或数据库来完成这项工作。@SolomonSlow是的,我想是的。也许他/她想检查所有可能的组合,在这种情况下,这个答案会有所帮助。我无法使用“List.of”(LinkedList(List.of))将名称添加到LinkedList.相反,我尝试在后面的方法中添加名称,结果如下:Weekend 1[1,4]Weekend 2[2,3]Weekend 3[3,3]Weekend 4[1,1]Weekend 5[4,4]Weekend 6[2,4]Weeke