首页 > 解决方案 > 有没有办法在使用 for 循环时只调用一次数组中的随机字符串值?

问题描述

我想制作一个程序,您可以在 for 循环中输入输入,并且在迭代之后,来自数组的随机字符串值将与它一起放置在最后的输出消息中。我不希望字符串值重复,我希望每个值只产生一次。我该怎么做呢?(两个数组中的 int 值和字符串值也需要保持匹配,所以苹果应该总是导致喜欢他的数字 1,香蕉的数字 2 等等)

我希望输出如下:

亚历克斯喜欢芒果和数字 3

约翰喜欢苹果和数字 1

简喜欢香蕉和 2 号

代替:

亚历克斯喜欢芒果和数字 3

约翰喜欢芒果和数字 3

简喜欢苹果和数字 1

package example;
import javax.swing.JOptionPane;
import java.util.Random;
public class Example {

    public static void main(String[] args) {
        
        StringBuilder generator = new StringBuilder();
        
        for (int a=1; a<4; a++){
            
            String name = JOptionPane.showInputDialog(null, "Enter person " + a + "'s name");
            
            Random random = new Random();
            String [] fruit = {"apples", "bananas", "mangos"};
            int [] number = {1, 2, 3};
            int randomIndex = random.nextInt(fruit.length);
            
            generator.append(name).append(" likes ").append(fruit[randomIndex]).append(" and the number ").append(number[randomIndex]).append("\n");     
        }
        JOptionPane.showMessageDialog(null, generator);
    }
    
}

标签: javaarraysfor-looprandom

解决方案


您可以在 for 循环之外创建打乱的水果和数字列表,然后使用它们的索引获取唯一元素:

final StringBuilder generator = new StringBuilder();
final List<String> fruits = Arrays.asList("apples", "bananas", "mangos");
final List<Integer> numbers = Arrays.asList(1, 2, 3);

Collections.shuffle(fruits);
Collections.shuffle(numbers);

assert fruits.size() == numbers.size();

for (int i = 0; i < fruits.size(); i++) {
    final String name = JOptionPane.showInputDialog(null, "Enter person " + i + "'s name");

    generator.append(name)
        .append(" likes ")
        .append(fruits.get(i))
        .append(" and the number ")
        .append(numbers.get(i))
        .append("\n");
}

JOptionPane.showMessageDialog(null, generator);

推荐阅读