有没有办法在使用 for 循环时只调用一次数组中的随机字符串值?

问题描述

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

我希望输出如下:

Alex 喜欢芒果和数字 3

约翰喜欢苹果和数字 1

简喜欢香蕉和数字 2

代替:

Alex 喜欢芒果和数字 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);
    }
    
}

解决方法

您可以在 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);
,

您需要保持某种状态以确保不会重复数字。最懒惰的方法是从 number 数组中删除您正在检索的值。

如果您将 number 数组转换为整数列表并使用 pop 方法检索该值,它应该会按预期工作。