Как создать карту, которая принимает случайные ключи и значения java? - PullRequest
0 голосов
/ 14 апреля 2020

Я хотел бы создать карту, которая будет генерировать случайные данные (она будет генерировать случайное значение для каждого ключа). Карта предназначена для двойных чисел, и это из упражнения и ее следует рассматривать как альтернативу в случае, если я не могу использовать предыдущую карту с данными в файле (mapOfEarth) Я глубоко задумался над этим, но не могу получить правильный ответ. Помогите? Я знаю размеры карты, но не знаю, как генерировать значения. Я попробовал следующий код:

 public void generateMap(double resolution) {
    String altitude;
    if (resolution == 1) {
        mapOfEarth = new HashMap<>(64800);
    } else if (resolution == 0.5) {
        mapOfEarth = new HashMap<>(259200);
    } else if (resolution == 2) {
        mapOfEarth = new HashMap<>(16200);

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

IntStream

Ваш вопрос неясен относительно типов данных и того, должно ли значение записей карты быть нулевым. Я предполагаю простой случай Integer ключей и нулевых значений.

Поток заполняет карту

Классы Random и ThreadLocalRandom теперь предлагают ints метод. Этот метод возвращает поток чисел, в частности IntStream.

int initialCapacity = 3;  // 16_200 or 64_800 or 259_200.
Map < Integer, UUID > map = new HashMap <>( initialCapacity );
IntStream numbers = ThreadLocalRandom.current().ints( initialCapacity );
numbers.forEach( number -> map.put( number , null ) );  // Auto-boxing wraps the primitive `int` as an `Integer` object.

Дамп на консоль.

System.out.println( map );

При запуске.

{837992347 = ноль, 1744654283 = ноль, -393617722 = ноль}

Поток создает карту

Вы могли бы даже сделать из этого одну строчку, попросив поток создать экземпляр Map, а не предварительно инициализировать его.

Я не предполагаю, что это лучше, но это немного интересно. Мне пришлось попросить Создать карту из IntStream ключей , чтобы узнать, как это сделать.

Map < Integer, UUID > map =
        ThreadLocalRandom
                .current()                                    // Returns a random number generator.
                .ints( 3 )                                    // Produces three random numbers, the limit being the number passed here.
                .boxed()                                      // Invokes auto-boxing to wrap each primitive `int` as an `Integer` object.
                .collect(                                     // Gathers the outputs of this stream into a collection.
                        Collectors.toMap(                     // Returns a `Collector`, a collector that knows how to produce a `java.util.Map` object.
                                Function.identity() ,         // Returns each `Integer` produced by the stream. No further actions needed here, we just want the number.
                                number -> UUID.randomUUID()   // Generate some object to use as the value in each map entry being generated. Not important to this demo.
                        )                                     // Returns a `Collector` used by the `collect` method.  
                );                                            // Returns a populated map.

map.toString (): {1996421820 = bbb468b7-f789-44a9-bd74-5c3d060081d0, -717171145 = 7bd89a89-8b04-4532-82ae-437788378814, 996403745 = 696403745 = 359633745 4a09-8644-59d846a815d4}

Этот подход потока-экземпляров-карт является неправильным путем к go, если вы хотите выбрать конкретный класс, реализующий Map.

Table of map implementations in Java 11, comparing their features

0 голосов
/ 14 апреля 2020

библиотека импорта commons-lang3

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.9</version>
</dependency>

и рассмотрите возможность использования кода ниже `

public static void main(String[] args) {

    int numberOfElements = RandomUtils.nextInt(0, 100);

    boolean useLetters = RandomUtils.nextBoolean(), //
            useNumbers = RandomUtils.nextBoolean();

    int keyLength = RandomUtils.nextInt(1, 10), //
            valueLength = RandomUtils.nextInt(1, 10);

            Map<String, String> map = generateMap( //
            numberOfElements, //
            useLetters, //
            useNumbers, //
            keyLength, //
            valueLength //
    );

    for (String key : map.keySet()) {
        System.out.println("key = " + key + "; value = " + map.get(key));
    }
}

private static Map<String, String> generateMap( //
        int numberOfElements //
        , boolean useLetters //
        , boolean useNumbers //
        , int keyLength //
        , int valueLength //
) {
    Map<String, String> result = new HashMap<String, String>();
    for (int i = 0; i < numberOfElements; i++) {

        String key = RandomStringUtils.random(keyLength, useLetters, useNumbers);
        String value = RandomStringUtils.random(valueLength, useLetters, useNumbers);

        result.put(key, value);
    }
    return result;
}

`

...