Java - 从地图中的列表中检索单个值
Java - Retrive Indivudual Values from a List in a Map
我有一个包含 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 进行排序并相应地对另一个进行排序。起初看似微不足道的事情,后来证明是一个真正的挑战。
我是一个爱好编程的人,所以请高手们多多包涵。
看来你过度设计了。
我会先回答一个 Stream
的解决方案,只是为了尝试一下。
请注意,我个人更喜欢 "old" 迭代方法(见下文)。
// 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<Person>
。
例如,尽可能保持简单
final List<Person> persons = new ArrayList<>();
// Populate list
Collections.sort(persons, (p1, p2) -> {
// Not null-safe
return p1.getName().compareTo(p2.getName());
});
这将按 name
对列表进行排序。它不会return一个新的列表,而只是修改输入的列表。
综合所有宝贵的技巧、网上搜索和我的努力,这是我最终的解决方案(希望对其他人有用)。在我看来,我的解决方案简单明了:
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);
}
class 个网站下方:
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;
}
}
我有一个包含 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 进行排序并相应地对另一个进行排序。起初看似微不足道的事情,后来证明是一个真正的挑战。
我是一个爱好编程的人,所以请高手们多多包涵。
看来你过度设计了。
我会先回答一个 Stream
的解决方案,只是为了尝试一下。
请注意,我个人更喜欢 "old" 迭代方法(见下文)。
// 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<Person>
。
例如,尽可能保持简单
final List<Person> persons = new ArrayList<>();
// Populate list
Collections.sort(persons, (p1, p2) -> {
// Not null-safe
return p1.getName().compareTo(p2.getName());
});
这将按 name
对列表进行排序。它不会return一个新的列表,而只是修改输入的列表。
综合所有宝贵的技巧、网上搜索和我的努力,这是我最终的解决方案(希望对其他人有用)。在我看来,我的解决方案简单明了:
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);
}
class 个网站下方:
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;
}
}