Java-从映射中的列表中检索Indivudual值
我有一个包含3个条目的树状图,全部来自单个ArrayList 我使用以下代码:Java-从映射中的列表中检索Indivudual值,java,list,arraylist,iteration,treemap,Java,List,Arraylist,Iteration,Treemap,我有一个包含3个条目的树状图,全部来自单个ArrayList 我使用以下代码: Map<String, List<String>> mapOne = new TreeMap<String, List<String>>(); List<String> listFour = Arrays.asList(""); ArrayList<String> listOne = new ArrayList<>(); listO
Map<String, List<String>> mapOne = new TreeMap<String, List<String>>();
List<String> listFour = Arrays.asList("");
ArrayList<String> listOne = new ArrayList<>();
listOne.add("Writer");
listOne.add("Actor");
listOne.add("Politician");
listOne.add("Dancer");
ArrayList<String> listTwo = new ArrayList<>();
listTwo.add("James");
listTwo.add("Robert");
listTwo.add("Tereza");
listTwo.add("John");
ArrayList<String> listThree = new ArrayList<>();
listThree.add("Joyce");
listThree.add("Redford");
listThree.add("May");
listThree.add("Travolta");
for (int i = 0; i < listOne.size(); i++) {
String stringOne = listOne.get(i);
String stringTwo = listTwo.get(i);
String stringThree = listThree.get(i);
listFour = Arrays.asList(stringTwo, stringThree);
mapOne.put(stringOne, listFour);
}
是否可以在列表中进行迭代,以获得单独的列表,一个是名字,另一个是姓氏
listOne = {Robert , John , Tereza, James}
listTwo = {Redford, Travolta, May, Joyce}
或者我应该使用完全不同的方法
整个事情都是从一个ArrayList和另一个ArrayList的排序开始的。一开始看似微不足道的事情,结果却是一个真正的挑战
我是一个有点业余爱好的程序员,所以那里的专业人士请容忍我。你似乎有点过度工程化了
我将首先用流
解决方案回答,只是为了尝试一下。请注意,我个人更喜欢“旧的”迭代方法(见下文) 输出:
[Robert, John, Tereza, James]
[Redford, Travolta, May, Joyce]
这是安全的,因为您知道每个内部列表都有两个元素
JB Nizet告诉您要做的(感谢他写了这篇文章),基本上是创建一个合适的类
public class Person {
private String profession;
private String name;
private String surname;
// Getters and setters. JavaBean style
}
然后对集合进行排序
例如,保持它尽可能简单
final List<Person> persons = new ArrayList<>();
// Populate list
Collections.sort(persons, (p1, p2) -> {
// Not null-safe
return p1.getName().compareTo(p2.getName());
});
final List persons=new ArrayList();
//填充列表
集合。排序(个人,(p1,p2)->{
//非空安全
返回p1.getName().compareTo(p2.getName());
});
这将按名称对列表进行排序。它不会返回新的列表,只需修改输入的列表。将所有有价值的提示、在线搜索和我的努力放在一起,这是我的最终解决方案(希望对其他人有用)。在我看来,我的解决方案是简单明了的:
List<Sites> listOfSites = new ArrayList<Sites>();
for (int i = 0; i < classLists.listSites.size(); i++) {
String site = classLists.listSites.get(i);
String description = classLists.listSitesDesc.get(i);
String link = classLists.listSitesLinks.get(i);
listOfSites.add(new Sites(site, description, link));
}
Collections.sort(listOfSites, (p1, p2) -> {
return p1.getName().compareTo(p2.getName());
});
final ArrayList<String> titles = new ArrayList<>();
final ArrayList<String> descriptions = new ArrayList<>();
final ArrayList<String> links = new ArrayList<>();
for (Sites s : listOfSites) {
String name = s.getName();
String description = s.getDesc();
String link = s.getLink();
titles.add(name);
descriptions.add(description);
links.add(link);
}
listofsite=newarraylist();
对于(int i=0;i{
返回p1.getName().compareTo(p2.getName());
});
最终ArrayList标题=新ArrayList();
最终ArrayList描述=新建ArrayList();
最终ArrayList链接=新建ArrayList();
对于(站点:站点列表){
字符串名称=s.getName();
字符串描述=s.getDesc();
String link=s.getLink();
标题。添加(名称);
说明。添加(说明);
链接。添加(链接);
}
班级网站下方:
public class Sites implements Comparable<Sites> {
private String name;
private String description;
private String link;
public Sites(String name, String description, String link) {
this.name = name;
this.description = description;
this.link = link;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return description;
}
public void setDesc(String description) {
this.description = description;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
}
公共类站点实现可比较的{
私有字符串名称;
私有字符串描述;
私有字符串链接;
公共站点(字符串名称、字符串描述、字符串链接){
this.name=名称;
this.description=描述;
this.link=link;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getDesc(){
返回说明;
}
公共void setDesc(字符串描述){
this.description=描述;
}
公共字符串getLink(){
返回链接;
}
公共无效设置链接(字符串链接){
this.link=link;
}
}
整个过程都是从需要对一个ArrayList和另一个ArrayList进行排序开始的。如果使用对象而不是并行列表,那么整个过程(包括这种排序)都将变得微不足道。使用单个列表,其中Person是一个具有名字、姓氏和职业的类。然后,您可以按名字、姓氏或职业对这些人进行排序。感谢您提及此方法。我以前研究过这个想法,但在实施上有困难。您是否碰巧有更多的细节、链接或代码片段?list.sort(Comparator.comparing(Person::getFirstName))
。这将按名字对人员列表进行排序。这就是你要问的吗?如果能在我的代码中使用Person{public String profession;public String name;public String names;}之类的公共类,我将不胜感激。我承认我的查询听起来一定很业余,但我非常愿意学习一些东西。@rainer我用一个自定义比较器的例子更新了答案。很抱歉,如果你想让我删除这个部分,请告诉我,这样你就可以发布一个答案。非常感谢这个解释得很好的答案。这些解决方案非常有效。我的信条通常是保持事情简单,正如你上面提到的,我确实有一种过度工程化的印象。
public class Person {
private String profession;
private String name;
private String surname;
// Getters and setters. JavaBean style
}
final List<Person> persons = new ArrayList<>();
// Populate list
Collections.sort(persons, (p1, p2) -> {
// Not null-safe
return p1.getName().compareTo(p2.getName());
});
List<Sites> listOfSites = new ArrayList<Sites>();
for (int i = 0; i < classLists.listSites.size(); i++) {
String site = classLists.listSites.get(i);
String description = classLists.listSitesDesc.get(i);
String link = classLists.listSitesLinks.get(i);
listOfSites.add(new Sites(site, description, link));
}
Collections.sort(listOfSites, (p1, p2) -> {
return p1.getName().compareTo(p2.getName());
});
final ArrayList<String> titles = new ArrayList<>();
final ArrayList<String> descriptions = new ArrayList<>();
final ArrayList<String> links = new ArrayList<>();
for (Sites s : listOfSites) {
String name = s.getName();
String description = s.getDesc();
String link = s.getLink();
titles.add(name);
descriptions.add(description);
links.add(link);
}
public class Sites implements Comparable<Sites> {
private String name;
private String description;
private String link;
public Sites(String name, String description, String link) {
this.name = name;
this.description = description;
this.link = link;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return description;
}
public void setDesc(String description) {
this.description = description;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
}