Как сравнить строки одного массива в Java?

165
04 августа 2021, 18:10

Допустим есть массив

String[] names = {"Bill", "Den", "James", "Den", "Loris", "Bill", "Den"};

Как можно сравнить в цикле for (или по другому) эти строки друг с другом? Моя задача именно в том, чтобы вывести имена строк (элементов массива), которые повторяются и вывести количество раз каждой строки, которая встречается в массиве.

Вот конкретный пример, но здесь что-то не так точно.

static public Map<String, Integer> getDuplicate(ArrayList<Unit> list) {
    Map<String, Integer> dupEl = new HashMap<>();
    int count = 0;
    for (int i = list.size() - 1; i > 0; i--) {
        for (int j = 0; j < i; j++) {
            if (list.get(j).equals(list.get(i))) {
                dupEl.put(list.get(i).toString(), ++count);
            }
        }
    }
    return dupEl;
}

Юнит класс ничего необычного, тестовый класс :

public class Unit {
    private String name;
    private int age;
    public Unit(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Unit unit = (Unit) o;
        if (age != unit.age) return false;
        return name != null ? name.equals(unit.name) : unit.name == null;
    }
    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }
    @Override
    public String toString() {
        return "name='" + name;
    }
}

Раз на то пошло, вот сам список и вызов метода:

ArrayList<Unit> mylist = new ArrayList<>();
mylist.add(new Unit("Edik", 40));
mylist.add(new Unit("Bill", 35));
mylist.add(new Unit("Grace", 25));
mylist.add(new Unit("Jason", 37));
mylist.add(new Unit("Edik", 40));
/* 1) Найти дубликаты  в списке
 * 2) Вывести название дублируемого объекта
 * 3) Указать количество раз, когда встречается объект в списке.
 * */
getDuplicate(mylist).forEach((k, v) -> System.out.println(k + ": " + v));
Answer 1

предложу еще такое решение со стримами

public static Map<Unit,Long> getDuplicate(List<Unit> list) {
    return list.stream()
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
}
Answer 2
static public Map<Unit,Integer> getDuplicate(List<Unit> list) {
    Map<String,Integer> dupEl= new HashMap<>();
    for (Unit unit : list) {
        if (dupEl.get(unit) == null) {
            dupEl.put(unit, 1);
        } else {
            duplEl.put(unit, duplEl.get(unit) + 1)
        }
    }
    return dupEl;
}

или если Java версии 8+

public Map<Unit,Integer> getDuplicate(List<Unit> list) {
    Map<String,Integer> map = new HashMap<>();
    list.forEach(unit -> map.put(unit , map.getOrDefault(unit , 0) + 1));
    return map;
}
Answer 3

Если нужна именно карта Map<String, Integer>, то в данном случае поле age и методы equals, hashCode и toString вообще не нужны, потому что они не используются.

Чтобы собрать дублирующиеся элементы листа в карту, можно использовать метод stream.collect:

public class Test {
    public static class Unit {
        private final String name;
        public Unit(String name) {
            this.name = name;
        }
    }
    static public Map<String, Integer> getDuplicate(ArrayList<Unit> list) {
        return list.stream()
                // собираем в карту
                // дублирующиеся объекты
                .collect(Collectors.toMap(
                        // ключ - строка,
                        // поле 'name'
                        e -> e.name,
                        // значение - количество
                        e -> 1,
                        // суммируем колличество
                        Integer::sum));
    }
    public static void main(String[] args) {
        ArrayList<Unit> myList = new ArrayList<>();
        myList.add(new Unit("Edik"));
        myList.add(new Unit("Bill"));
        myList.add(new Unit("Grace"));
        myList.add(new Unit("Jason"));
        myList.add(new Unit("Edik"));
        getDuplicate(myList).forEach((k, v) -> System.out.println(k + ": " + v));
    }
}

Вывод:

Edik: 2
Grace: 1
Bill: 1
Jason: 1
READ ALSO
Java. Нужна критика.. Оцените код

Java. Нужна критика.. Оцените код

Изучаю Java 3-4 месяца, дошел до многопоточностиРешил написать свою простую программу из того, что знаю

472
Как сделать так, чтобы функция возвращала 2 и более значений?

Как сделать так, чтобы функция возвращала 2 и более значений?

У меня есть функция, которая должна возвращать сразу 4 значенияКак сделать так, чтоб это стало возможным?

162
Есть ли возможность узнать индекс считываемоего из .txt символа?

Есть ли возможность узнать индекс считываемоего из .txt символа?

Необходимо считывать из несколькихtxt файлов построчно символы и записывать в массив

248