Created
June 1, 2018 09:02
-
-
Save hoangtranwork/ce361eeaecf38cecdbab6decac19f13f to your computer and use it in GitHub Desktop.
Kotlin version of this https://stackoverflow.com/questions/5551186/java-lib-to-build-and-print-table-on-console/14455624#14455624
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ConsoleStringTable { | |
private data class Index(val row: Int, val column: Int) | |
private val contents = mutableMapOf<Index, String>() | |
private val columnSizes = mutableMapOf<Int, Int>() | |
private var rowCount = 0 | |
private var columnCount = 0 | |
fun addString(row: Int, column: Int, content: String) { | |
rowCount = Math.max(rowCount, row + 1) | |
columnCount = Math.max(columnCount, column + 1) | |
val index = Index(row, column) | |
contents[index] = content | |
setMaxColumnSize(column, content) | |
} | |
private fun setMaxColumnSize(column: Int, content: String) { | |
val size = content.length | |
val currentSize = columnSizes[column] | |
if (currentSize == null || currentSize < size) { | |
columnSizes[column] = size | |
} | |
} | |
private fun getColumnSize(column: Int): Int = columnSizes[column] ?: 0 | |
private fun getString(row: Int, column: Int): String { | |
val index = Index(row, column) | |
val string = contents[index] | |
return string ?: "" | |
} | |
fun getTableAsString(padding: Int): String { | |
val out = StringBuilder() | |
for (row in 0 until rowCount) { | |
for (col in 0 until columnCount) { | |
val columnSize = getColumnSize(col) | |
val content = getString(row, col) | |
val pad = if (col == columnCount - 1) 0 else padding | |
out.append(content.padEnd(columnSize + pad)) | |
} | |
out.append(System.lineSeparator()) | |
} | |
return out.toString() | |
} | |
override fun toString(): String = getTableAsString(1) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment