【问题标题】:Java - Retrive Indivudual Values from a List in a MapJava - 从地图中的列表中检索单个值
【发布时间】:2019-08-21 23:38:10
【问题描述】:

我有一个包含 3 个条目的 TreeMap,全部来自单独的 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);

}

现在我想从排序列表中获取各个字符串值。像这样:

for (Map.Entry<String, List<String>> entry : mapOne.entrySet()) {

    String key = entry.getKey();

    for (String value : entry.getValue()) {

        System.out.println(value);

    }
}

上面的代码打印了一个类似

的列表
{Robert Redford , John Travolta , Tereza May , James Joyce} 

是否有可能以某种方式遍历列表以获得单独的列表,一个带有名字,另一个带有姓氏?

listOne = {Robert , John , Tereza, James}
listTwo = {Redford, Travolta, May, Joyce}

或者我应该使用完全不同的方法吗?

整个事情开始于需要对一个 ArrayList 进行排序并相应地对另一个进行排序。一开始看起来微不足道的事情,结果却是一个真正的挑战。

我是一个爱好程序员,所以那里的专业人士请多多包涵。

【问题讨论】:

  • 整个事情开始于需要对一个 ArrayList 进行排序并相应地对另一个进行排序。:如果您使用对象代替,整个事情,包括这种排序,将是微不足道的使用并行列表。使用单个 List,其中 Person 是具有名字、姓氏和职业的类。然后,您可以按名字、姓氏或职业对人员进行排序。
  • 感谢您提及该方法。我之前研究过这个想法,但在实施时遇到了困难。您是否碰巧有更多详细信息,链接或sn-p?
  • list.sort(Comparator.comparing(Person::getFirstName))。这会按名字对人员列表进行排序。你问的是这个吗?
  • 我希望了解更多有关使用公共类的详细信息,例如:Person { public String professional;公共字符串名称;公共字符串姓氏; } 在我的代码中。我确实知道我的查询听起来很业余,但我非常愿意学习一些东西。
  • @rainer 我用自定义比较器的示例更新了答案。抱歉 JB Nizet,告诉我您是否希望我删除该部分以便您发布答案。

标签: java list arraylist iteration treemap


【解决方案1】:

您似乎在某种程度上过度设计

我将首先回答 Stream 解决方案,只是为了尝试它。
请注意,我个人更喜欢“旧”迭代方法(见下文)。

// You can see by the use of AtomicInteger that this isn't the right road to take!
final AtomicInteger i = new AtomicInteger();
final Collection<List<String>> values1 =
        mapOne.values()
              .stream()
              .flatMap(v -> v.stream())
              .collect(partitioningBy(o -> i.getAndIncrement() % 2 != 0))
              .values();

输出:[[Robert, John, Tereza, James], [Redford, Travolta, May, Joyce]]


迭代方法

final Collection<String> names = new ArrayList<>();
final Collection<String> surnames = new ArrayList<>();

for (final List<String> value : mapOne.values()) {
    names.add(value.get(0));
    surnames.add(value.get(1));
}

输出:

[Robert, John, Tereza, James]
[Redford, Travolta, May, Joyce]

这是安全的,因为您知道每个内部 List 有两个元素。


JB Nizet 告诉你要做的事情(感谢他的写作),基本上是创建一个合适的 class

public class Person {
   private String profession;
   private String name;
   private String surname;

   // Getters and setters. JavaBean style
}

然后继续对Collection&lt;Person&gt;进行排序。
例如,尽量简单

final List<Person> persons = new ArrayList<>();

// Populate list

Collections.sort(persons, (p1, p2) -> {
    // Not null-safe
    return p1.getName().compareTo(p2.getName());
});

这将按name 对列表进行排序。它不会返回一个新的列表,而只是修改输入的列表。

【讨论】:

  • 非常感谢这个解释清楚的答案。解决方案完美运行。我的口头禅通常是让事情保持简单,正如你上面提到的,我确实有一种过度设计的印象。
【解决方案2】:

将所有有价值的提示、在线搜索和我的努力放在一起,这是我的最终解决方案(希望它可能对其他人有用)。在我看来,我的解决方案既简单又简单:

    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;

    }

} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2017-02-27
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多