Допустим есть массив
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));
предложу еще такое решение со стримами
public static Map<Unit,Long> getDuplicate(List<Unit> list) {
return list.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
}
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;
}
Если нужна именно карта 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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Изучаю Java 3-4 месяца, дошел до многопоточностиРешил написать свою простую программу из того, что знаю
У меня есть функция, которая должна возвращать сразу 4 значенияКак сделать так, чтоб это стало возможным?
Необходимо считывать из несколькихtxt файлов построчно символы и записывать в массив