java - (Kotlin)如何将 HashMap 输出保存到文件

标签 java kotlin hashmap

选择选项8时,我无法将哈希图的内容写入文件。我已成功读取文件,并利用各种功能来调整产品目录。但是,每次选择保存选项时。文件清除减去产品的1。

这是我的代码

var products = HashMap<Int, Pair<String, Double>>()
val fileName = "src/products.txt"
var inputFD = File(fileName).forEachLine {
    var pieces = it.split(",")
    products[ pieces[0].toInt() ] = Pair(pieces[1], pieces[2].toDouble())
}
fun main() {
        var menuItems = arrayOf(
                "View all products",
                "Add a new product",
                "Delete a product",
                "Update a product",
                "View highest priced product",
                "View lowest priced product",
                "View sum of all product prices",
                "Exit and save"
        )
        var quitOption = menuItems.size
        var userChoice = 0
        while (userChoice != quitOption) {
            println()
            userChoice = menu(menuItems, "\nPlease enter your selection: ")
            when (userChoice) {
                1 -> viewAll()
                2 -> addProduct()
                3 -> deleteProduct()
                4 -> updateProduct()
                5 -> viewHighestPricedProduct()
                6 -> viewLowestPricedProduct()
                7 -> sumAllProductPrices()

                else -> {
                    if (userChoice != quitOption) {
                        println("ERROR: Please select a valid menu option.")
                    }
                    fileSave()
                }
            }
        }
}

fun sumAllProductPrices() {
    viewAll()
    println()
    var sum = 0.0
    for( product in products) {
        sum += product.value.second
    }
    println( "The sum of all the product prices is: ${ "$%.2f".format( sum )}")
}

fun viewLowestPricedProduct() {
    println()
    products.minBy { it.value.second }?.let {
        val (key, value) = it
        println("The highest priced product is: ")
        println()
        println("Item#    Description      Price")
        println("-----    -------------    -------")
        println( "$key      ${"%-13s".format(value.first)}    ${ "$%.2f".format(value.second )}" )
    }
}

fun viewHighestPricedProduct() {
    println()
    products.maxBy { it.value.second }?.let {
        val (key, value) = it
        println("The highest priced product is: ")
        println()
        println("Item#    Description      Price")
        println("-----    -------------    -------")
        println( "$key      ${"%-13s".format(value.first)}    ${ "$%.2f".format(value.second )}" )
    }
}

fun updateProduct() {
    viewAll()
    println()
    print( "Please enter the Item# of the product you would like to update: " )
    var updateItem = readLine()!!.toInt()

    if( products.containsKey(updateItem)) {
        print( "Please enter a new description of the item: " )
        var description = readLine()!!
        print( "Please enter a new price of the item: " )
        var price = readLine()!!.toDouble()
        products[updateItem] = Pair(description, price)
        println( "Thank you. The product has been updated." )
    }else {
        println("Sorry. That item does not exist.")
    }
}

fun deleteProduct() {
    viewAll()
    println()
    println( "Please enter the Item# of the product you would like to delete: ")
    var removeItem = readLine()!!.toInt()
    if( products.containsKey(removeItem)) {
        products.remove(removeItem)
        println("Thank you. The product has been removed.")
    } else {
        println("Sorry. That item does not exist.")
    }
}

fun addProduct() {
    var keyGen = ( 100..999 ).random()
    viewAll()
    println()
    if(products.containsKey(keyGen)) {
        keyGen = ( 100..999 ).random()
    } else {
        print( "Please enter the description of the new item: " )
        var productName = readLine()!!
        print( "Please enter the price for ${productName}: ")
        var productPrice = readLine()!!.toDouble()
        products[keyGen] = Pair(productName, productPrice.toDouble())
        println( "Thank you. The product has been added." )
    }
}

fun viewAll() {
    println()
    println("Item#    Description      Price")
    println("-----    -------------    -------")
    for( record in products.toSortedMap()) {
        println( "${record.key}      ${"%-13s".format(record.value.first)}    ${ "$%.2f".format( record.value.second )}" )
    }
}

fun menu(items: Array<String>, prompt: String): Int {
        for ((index, item) in items.withIndex()) {
            println("${index + 1}. $item")
        }
        print(prompt)
        return readLine()!!.toInt()
}
// Write method to write the hashmap back to the disk
fun fileSave() {
    var fd = File( fileName ).printWriter()
    for (record in products) {
        fd.println("${record.key},${record.value.first},${record.value.second}")
        fd.close()
    }
    println( "Thank you. The file has been saved.")
}

谢谢。感谢您为解决此问题所提供的帮助。

最佳答案

将所有记录写入文件后,应关闭文件打印机。

fd.close()移出for循环。

for (record in products) {
    fd.println("${record.key},${record.value.first},${record.value.second}")
    // fd.close() << from here
}
fd.close() // to here

关于java - (Kotlin)如何将 HashMap 输出保存到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62112491/

相关文章:

java - 将静态变量值传递给另一个类

java - 具有空构造函数的 fragment 与 newInstance

android - 与 Android 上的加密相比,解密要慢得多

android - 列表项属性更改时,Livedata 不会更新撰写状态

javascript - 幕后是否存在 JavaScript 中的数组/列表?

c++ - boost::unordered_map -- 需要指定自定义哈希函数来散列 std::set<int> 吗?

java - 使用模型 API 创建普通 JOOQ SQL 查询

java - 该 Java Swing 组件的名称?

android - 使用 Retrofit2 和 Kotlin : Unable to create call adapter 在正文中发布数据

java - 如何在 HashMap 中存储 2 个组合的唯一键?