gpt4 book ai didi

java - 自定义 TreeSet 打印 Map.Entry 值的方式

转载 作者:行者123 更新时间:2023-12-01 20:15:53 24 4
gpt4 key购买 nike

我有一个TreeSet包含Map.Entry<String, Double>值以及当我尝试使用 Iterator 时要迭代此结构并打印其键值对,标准输出如下所示:

Tolkien=40.25 JKRowling=35.5 OBowden=14.0

但是我想为我的输出使用自定义格式并替换 =签名 ->像:

Tolkien -> 40.25, JKRowling -> 35.5, OBowden -> 14.0

这是我现在的代码:

Iterator iterator;.
iterator = lib.getSortedBooks().iterator();
while (iterator.hasNext()) {
System.out.printf(iterator.next() + " ");
}

正确设置输出格式的最佳方式是什么?

最佳答案

您只需将 = 字符替换为 -> 字符即可解决问题,例如:

Iterator<Entry<String, Double>> iterator = lib.getSortedBooks().iterator(); 
while (iterator.hasNext()) {
Entry book = iterator.next();
String bookAsText = book.toString();
String adjustedText = bookAsText.replace("=", " -> ");

System.out.print(adjustedText + ", ");
}

请注意,您的输出现在末尾有一个尾随 ,。您可以使用 String#substring 方法删除它,或者在处理最后一个元素时不附加它(使用 iterator.hasNext() 向前查找一个元素) )或者直接使用 StringJoiner,我稍后会向您展示。

<小时/>

但是,如果您总是想要显式输出,那么您不应该不依赖toString 方法按其方式打印它。这将来可能会改变,谁知道呢。

您应该显式构建输出。对此很有帮助的是 StringJoiner类,它允许您通过添加分隔符(例如 ,)来连接字符串。因此使用这样的代码:

Set<Entry<String, Double>> books = lib.getSortedBooks();
String entryDelimiter = ", "
String valueDelimiter = " -> ";

StringJoiner sj = new StringJoiner(entryDelimiter);
for (Entry<String, Double> book : books) {
sj.add(book.getKey());
sj.add(valueDelimiter);
sj.add(book.getValue());
}
String output = sj.toString();

System.out.println(output);
<小时/>

或者使用Streams的更紧凑的Java 8解决方案:

String output = lib.getSortedBooks().stream()
.map(book -> book.getKey() + " -> " + book.getValue())
.collect(Collectors.joining(", "));

System.out.println(output);

该方法使用该集合作为流的源。然后它首先将每个元素传输到 book.getKey() + "->"+ book.getValue() 中,这就是 Stream#map 的作用。之后,它将所有这些元素与 , 连接起来,最后收集它们。

请注意,如果您同意元素不再排序,它也可以并行化。因此,只需在中间调用 Stream#parallel 即可。它可以将给定流“转换”为并行流。

<小时/>

根据项目的大小,您应该考虑将图书的表示形式从 Map.Entry 更改为自己的类 Book,例如:

public class Book() {
private final String mAuthor;
private final double mPrice;

public Book(final String author, final double price) {
this.mAuthor = author;
this.mPrice = price;
}

public String getAuthor() {
return this.mAuthor;
}

public double getPrice() {
return this.mPrice;
}

@Override
public String toString() {
return getAuthor + " -> " + getPrice();
}
}

这种方法对于 future 的更改更加灵活,并且还允许您添加您认为最合适的 toString 表示形式。

因为,假设 lib.getSortedBooks() 返回一组 Book 而不是 Map.Entry,您可以简单地执行以下操作:

String output = lib.getSortedBooks().stream()
.map(Book::toString)
.collect(Collectors.joining(", "));

关于java - 自定义 TreeSet 打印 Map.Entry 值的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45828069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com