How do I get shuffled arrays in a list to match up with each other in Java?

117 Views Asked by At

I am new to coding and I wanted to know how I can code this program so that the arrays are matched. (apples and the number 1 match, bananas and the number 2 match and mangos and the number 3 match) I've used assert fruits.size() == numbers.size(); but its still not working, is there a way I can fix that?

package example;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import javax.swing.JOptionPane;

public class Example {
    
    public static void main(String[] args) {
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++) {
int a = i+1;
    final String name = JOptionPane.showInputDialog(null, "Enter person " + a + "'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);
    }
}

I would like the output to be:

Alex likes mangos and the number 3

John likes apples and the number 1

Jane likes bananas and the number 2

instead of:

Alex likes mangos and the number 1

John likes bananas and the number 3

Jane likes apples and the number 2

2

There are 2 best solutions below

0
On BEST ANSWER

I'd say the fruit and the number conceptually belong to the same object (a pair made of number + fruit name).

You should make an array of those pairs (for example using AbstractMap.SimpleEntry<String, Integer>, which is basically a pair with the fruit name as a key and the number as a value) and shuffle that.

Then you can retrieve the name with getKey() and the number with getValue()

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.AbstractMap;
import javax.swing.JOptionPane;

public class Example {

    public static void main(String[] args) {
        final StringBuilder generator = new StringBuilder();

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

        Collections.shuffle(fruits);

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

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

        JOptionPane.showMessageDialog(null, generator);
    }
}

Example output:

enter image description here

0
On

Assuming you have two lists:

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

You can do:

Map<Integer, String> numberToFruit = new HashMap<>();

for (int i = 0; i < fruits.size(); i++) {
    numberToFruit.put(numbers.get(i), fruits.get(i));
}

Collections.shuffle(numbers);

List<String> newFruits = numbers.stream()
        .map(numberToFruit::get)
        .collect(Collectors.toList());

System.out.println(newFruits);
System.out.println(numbers);

Output:

[apples, mangos, bananas]
[1, 3, 2]