Java-从映射中的列表中检索Indivudual值

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

我有一个包含3个条目的树状图,全部来自单个ArrayList

我使用以下代码:

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;

    }

}