我有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() + " ");
}
正确格式化输出的最佳方法是什么?
答案 0 :(得分:2)
您只需将=
字符替换为->
字符即可解决您的问题:
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()
查看一个元素),或者只使用我{'{1}},则不要将其删除稍后会告诉你。
但是,如果您总是希望显式输出,那么您应该StringJoiner
方法不依赖以打印方式打印它。这可能会在未来发生变化,谁知道。
您应该显式构建输出。有用的是StringJoiner类,它允许您通过添加分隔符toString
来连接字符串。因此,请使用以下代码:
,
使用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);
的更紧凑的 Java 8 解决方案:
Streams
该方法使用set作为流的源。然后它首先将每个元素转移到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();
}
}
表示。
因此,假设toString
返回一组lib.getSortedBooks()
而不是Book
,您可以执行以下操作:
Map.Entry
答案 1 :(得分:1)
System.out
内部的打印方法在内部使用toString()
,因此当您致电toString()
时,您会得到与输出中相同的内容。然后用箭头替换等号。
System.out.printf(iterator.next().toString().replace("=", " -> ") + " ");
更优雅的方法(实际上正确的方法,因为Map.Entry
对toString()
格式没有任何承诺):
Map.Entry<K, V> entry = iterator.next();
System.out.printf(entry.getKey() + " -> " + entry.getValue() + " ");