Как найти максимальное количество уникальных строковых элементов в списке alphanumeri c Array в java - PullRequest
2 голосов
/ 02 марта 2020

У меня есть список, в котором есть элементы alphanumeri c. Я хочу найти максимальное количество каждого элемента в отдельности.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Collect {
    public static void main(String[] args) {

        List<String> alphaNumericList = new ArrayList<String>();
        alphaNumericList.add("Demo.23");
        alphaNumericList.add("Demo.1000");
        alphaNumericList.add("Demo.12");
        alphaNumericList.add("Demo.12");
        alphaNumericList.add("Test.01");
        alphaNumericList.add("Test.02");
        alphaNumericList.add("Test.100");
        alphaNumericList.add("Test.99");

        Collections.sort(alphaNumericList);
        System.out.println("Output "+Arrays.asList(alphaNumericList));

    }

Мне нужен фильтр только ниже значений. Для этого я сортирую список, но он фильтрует по строке, а не по значению int. Я хочу добиться эффективным способом. Пожалуйста, предложите по этому вопросу. Демо.1000 Тест.100

Выход [[Демо.1000, Демо.12, Демо.12, Демо.23, Тест.01, Тест.02, Тест.100, Тест.99]]

Ответы [ 4 ]

1 голос
/ 02 марта 2020

Вы можете создать специальный тип AlphaNumericList, обернуть список массивов или любые другие коллекции, которые вы хотите использовать внутри, предоставив ему приятный интерфейс publi c для работы, или для простейшего случая, если вы хотите придерживаться ArrayList<String>, просто используйте Comparator для sort(..):

package de.scrum_master.stackoverflow.q60482676;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import static java.lang.Integer.parseInt;

public class Collect {
  public static void main(String[] args) {
    List<String> alphaNumericList = Arrays.asList(
      "Demo.23", "Demo.1000", "Demo.12", "Demo.12",
      "Test.01", "Test.02", "Test.100", "Test.99"
    );

    Collections.sort(
      alphaNumericList,
      (o1, o2) ->
        ((Integer) parseInt(o1.split("[.]")[1])).compareTo(parseInt(o2.split("[.]")[1]))
    );
    System.out.println("Output " + alphaNumericList);
  }
}

Это приведет к следующему журналу консоли:

Output [Test.01, Test.02, Demo.12, Demo.12, Demo.23, Test.99, Test.100, Demo.1000]

Пожалуйста, дайте мне знать если вы не понимаете лямбда-синтаксис. Вместо этого вы также можете использовать анонимный класс, как в предыдущих версиях Java.


Обновление 1: Если вы хотите реорганизовать однострочную лямбду для лучшей читаемости , может быть, вы предпочитаете это:

    Collections.sort(
      alphaNumericList,
      (text1, text2) -> {
        Integer number1 = parseInt(text1.split("[.]")[1]);
        int number2 = parseInt(text2.split("[.]")[1]);
        return number1.compareTo(number2);
      }
    );

Обновление 2: Если более одной точки "." символ может появляться в ваших строках, вам нужно получить подстроку Numberri c другим способом через совпадение с регулярным выражением, все еще не сложно:

    Collections.sort(
      alphaNumericList,
      (text1, text2) -> {
        Integer number1 = parseInt(text1.replaceFirst(".*[.]", ""));
        int number2 = parseInt(text2.replaceFirst(".*[.]", ""));
        return number1.compareTo(number2);
      }
    );

Обновление 3: Я просто заметил, что по какой-то странной причине вы помещаете отсортированный список в другой список с помощью Arrays.asList(alphaNumericList) при печати. Я заменил это на alphaNumericList в приведенном выше коде, а также обновил журнал консоли. До вывода было похоже на [[foo, bar, zot]], то есть вложенный список с одним элементом.

0 голосов
/ 02 марта 2020

Проверьте ниже ответ:

public static void main(String[] args) {
    List<String> alphaNumericList = new ArrayList<String>();
    alphaNumericList.add("Demo.23");
    alphaNumericList.add("Demo.1000");
    alphaNumericList.add("Demo.12");
    alphaNumericList.add("Demo.12");
    alphaNumericList.add("Test.01");
    alphaNumericList.add("Test.02");
    alphaNumericList.add("Test.100");
    alphaNumericList.add("Test.99");

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

    for (String val : alphaNumericList) {
        String key = val.split("\\.")[0];
        Integer value = Integer.valueOf(val.split("\\.")[1]);

        if (map.containsKey(key)) {
            map.get(key).add(value);
        } else {
            List<Integer> intList = new ArrayList<>();
            intList.add(value);
            map.put(key, intList);
        }
    }

    for (Map.Entry<String, List<Integer>> entry : map.entrySet()) {
        List<Integer> valueList = entry.getValue();
        Collections.sort(valueList, Collections.reverseOrder());
        System.out.print(entry.getKey() + "." + valueList.get(0) + " ");
    }
}
0 голосов
/ 02 марта 2020

Использование потока и toMap() сборщика.

Map<String, Long> result = alphaNumericList.stream().collect(
       toMap(k -> k.split("\\.")[0], v -> Long.parseLong(v.split("\\.")[1]), maxBy(Long::compare)));

Карта result будет содержать слово part в качестве ключа и максимальное число в качестве значения карты (в вашем примере карта будет содержать {Demo=1000, Test=100})

0 голосов
/ 02 марта 2020

а. Предполагая, что есть строка типа Demo. и тест. в вашем архиве. б. Это должно быть тривиально, чтобы отфильтровать элементы с помощью String Demo. а затем извлечь максимальное целое число для того же. c. То же самое должно быть применимо для извлечения максимального числа, связанного с тестом. Пожалуйста, проверьте следующий фрагмент кода для достижения того же.

 Set<String> uniqueString = alphaNumericList.stream().map(c->c.replaceAll("\\.[0-9]*","")).collect(Collectors.toSet());
    Map<String,Integer> map = new HashMap<>();

    for(String s:uniqueString){
      int max=  alphaNumericList.stream().filter(c -> c.startsWith(s+".")).map(c -> c.replaceAll(s+"\\.","")).map(c-> Integer.parseInt(c)).max(Integer::compare).get();
        map.put(s,max);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...