如何读取数据并为含List成员的类对象赋值并实现排序输出
解决方案
我来帮你搞定这个问题!核心思路是先解析输入数据,把同一个国家的州归集到一起,然后分别对国家和州按字母排序后输出。咱们一步步来:
1. 修正领域类的问题
首先看你现有的Country类,addState方法参数是String但要往List<State>里加,这明显不对,得改成创建State对象再添加。另外State类的compareTo方法得正确实现,确保能按名称排序:
class Country { String name; List<State> statelist = new ArrayList<>(); // 记得初始化集合,避免空指针 public void addState(String statename) { this.statelist.add(new State(statename)); // 创建State对象再加入集合 } // Getters and Setters public String getName() { return name; } public void setName(String name) { this.name = name; } public List<State> getStatelist() { return statelist; } } class State implements Comparable<State> { String name; public State(String name) { this.name = name; } @Override public int compareTo(State other) { // 按名称字母顺序排序,要忽略大小写的话可以用name.compareToIgnoreCase(other.name) return this.name.compareTo(other.name); } // Getter public String getName() { return name; } }
2. 实现Main类的逻辑
在Main类里,我们需要完成解析输入、归集数据、排序和输出这几个步骤:
import java.util.*; public class Main { public static void main(String[] args) { String input = "4 India|TamilNadu USA|Texas USA|Alaska India|Punjab"; // 拆分输入:第一个数字是条目数,后面是各个国家-州对 String[] parts = input.split(" "); // 用Map存储国家名称到Country对象的映射,避免重复创建国家实例 Map<String, Country> countryMap = new HashMap<>(); for (int i = 1; i < parts.length; i++) { String[] countryState = parts[i].split("\\|"); String countryName = countryState[0]; String stateName = countryState[1]; // 如果Map里没有这个国家,就创建新的Country对象 Country country = countryMap.getOrDefault(countryName, new Country()); country.setName(countryName); country.addState(stateName); countryMap.put(countryName, country); } // 把Map中的Country提取出来,按国家名称排序 List<Country> sortedCountries = new ArrayList<>(countryMap.values()); sortedCountries.sort(Comparator.comparing(Country::getName)); // 遍历排序后的国家,输出名称,再输出排序后的州 for (Country country : sortedCountries) { System.out.println(country.getName()); // 对当前国家的州列表排序(利用State实现的Comparable接口) Collections.sort(country.getStatelist()); for (State state : country.getStatelist()) { System.out.println(state.getName()); } } } }
3. 运行结果
执行上面的代码后,会输出符合要求的内容:
India Punjab TamilNadu USA Alaska Texas
关键细节说明
- 用
HashMap归集国家,保证同一个国家不会被重复创建,处理效率更高 - 两次排序:一次对国家列表按名称排序,一次对每个国家的州列表排序(借助
State实现的Comparable接口自动完成) getOrDefault方法简化了“判断国家是否存在”的逻辑,让代码更简洁易懂
内容的提问来源于stack exchange,提问作者D1vyA
相关产品推荐
相关产品推荐

