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

时间:2017-08-22 22:42:03

标签: java string-formatting treeset

我有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() + " ");
}

正确格式化输出的最佳方法是什么?

2 个答案:

答案 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.EntrytoString()格式没有任何承诺):

Map.Entry<K, V> entry = iterator.next();
System.out.printf(entry.getKey() + " -> " + entry.getValue() + " ");