Skip to content

Instantly share code, notes, and snippets.

@hoangtranwork
Created June 1, 2018 09:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hoangtranwork/ce361eeaecf38cecdbab6decac19f13f to your computer and use it in GitHub Desktop.
Save hoangtranwork/ce361eeaecf38cecdbab6decac19f13f to your computer and use it in GitHub Desktop.
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