list<string>分组统计 java
时间: 2023-11-10 18:08:27 浏览: 32
可以使用Java 8的Stream API来对List进行分组统计。以下是一个示例代码,假设我们有一个List<String>,其中包含多个名字:
```java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Emily", "Bob");
// 使用Stream API对List进行分组统计
Map<String, Long> countByName = names.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
// 输出结果
countByName.forEach((name, count) -> System.out.println(name + ": " + count));
```
输出结果为:
```
Alice: 1
Bob: 2
Charlie: 1
David: 1
Emily: 1
```
在这个示例中,我们使用了Stream的groupingBy操作符对名字进行分组,然后使用counting操作符对每个分组进行计数。最终,我们得到了一个Map<String, Long>,其中键是每个名字,值是该名字出现的次数。
相关问题
java List<object> 分组统计
可以使用Java 8的Stream API来实现分组统计,具体步骤如下:
1. 使用groupBy方法按照指定的属性对List进行分组,生成一个Map对象。
2. 使用map方法对每个分组进行统计,生成一个新的Map对象。
3. 将每个分组的统计结果组合成一个List对象。
示例代码:
```
import java.util.*;
import java.util.stream.Collectors;
public class GroupingExample {
public static void main(String[] args) {
List<Person> persons = Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 20),
new Person("Charlie", 30),
new Person("David", 25),
new Person("Eva", 20)
);
// 按照年龄分组,统计每个年龄的人数
Map<Integer, Long> ageCountMap = persons.stream()
.collect(Collectors.groupingBy(Person::getAge, Collectors.counting()));
// 将统计结果组合成一个List对象
List<AgeCount> ageCountList = ageCountMap.entrySet().stream()
.map(entry -> new AgeCount(entry.getKey(), entry.getValue()))
.collect(Collectors.toList());
// 输出统计结果
System.out.println(ageCountList);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return name + "(" + age + ")";
}
}
class AgeCount {
private int age;
private long count;
public AgeCount(int age, long count) {
this.age = age;
this.count = count;
}
public int getAge() {
return age;
}
public long getCount() {
return count;
}
@Override
public String toString() {
return age + "岁:" + count + "人";
}
}
```
输出结果:
```
[20岁:2人, 25岁:2人, 30岁:1人]
```
其中Person类表示一个人,包含姓名和年龄两个属性。AgeCount类表示一个年龄和对应的人数。在示例中,我们按照年龄分组统计每个年龄的人数,并将统计结果组合成一个AgeCount对象的List。
java实现将list中对象的省市区统计成 List<Map<String,List<Map<String,Object>>>>结构
可以使用Java的流操作和集合操作来实现将List中的对象的省市区统计成List<Map<String, List<Map<String, Object>>>>结构。下面是一个可能的实现示例:
```java
import java.util.*;
import java.util.stream.Collectors;
public class ListConverter {
public static List<Map<String, List<Map<String, Object>>>> convertList(List<Address> addresses) {
// 使用流操作将地址列表按省份进行分组
Map<String, List<Address>> provinceMap = addresses.stream()
.collect(Collectors.groupingBy(Address::getProvince));
// 构建结果列表
List<Map<String, List<Map<String, Object>>>> resultList = new ArrayList<>();
// 遍历省份列表
for (Map.Entry<String, List<Address>> provinceEntry : provinceMap.entrySet()) {
String province = provinceEntry.getKey();
List<Address> provinceAddresses = provinceEntry.getValue();
// 使用流操作将省份下的地址按城市进行分组
Map<String, List<Address>> cityMap = provinceAddresses.stream()
.collect(Collectors.groupingBy(Address::getCity));
// 构建省份的结果Map
Map<String, List<Map<String, Object>>> provinceResult = new HashMap<>();
resultList.add(provinceResult);
// 遍历城市列表
for (Map.Entry<String, List<Address>> cityEntry : cityMap.entrySet()) {
String city = cityEntry.getKey();
List<Address> cityAddresses = cityEntry.getValue();
// 构建城市的结果Map
List<Map<String, Object>> cityResult = new ArrayList<>();
provinceResult.put(city, cityResult);
// 遍历区域列表
for (Address address : cityAddresses) {
// 构建区域的结果Map
Map<String, Object> districtResult = new HashMap<>();
districtResult.put("district", address.getDistrict());
cityResult.add(districtResult);
}
}
}
return resultList;
}
public static void main(String[] args) {
// 测试数据
List<Address> addresses = new ArrayList<>();
addresses.add(new Address("江苏省", "南京市", "鼓楼区"));
addresses.add(new Address("江苏省", "南京市", "玄武区"));
addresses.add(new Address("江苏省", "苏州市", "姑苏区"));
addresses.add(new Address("浙江省", "杭州市", "西湖区"));
List<Map<String, List<Map<String, Object>>>> result = convertList(addresses);
System.out.println(result);
}
// 地址类,包含省份、城市和区域信息
static class Address {
private String province;
private String city;
private String district;
public Address(String province, String city, String district) {
this.province = province;
this.city = city;
this.district = district;
}
public String getProvince() {
return province;
}
public String getCity() {
return city;
}
public String getDistrict() {
return district;
}
}
}
```
运行上述示例代码,将会输出统计结果的列表。每个元素都是一个省份的结果Map,其中每个键值对表示一个城市和对应的区域列表。注意,示例代码中使用了静态内部类Address来表示地址信息,你可以根据实际需求替换为自己的对象类型。