如何在Kotlin中使用Stack(来自java)?
或者还有其他选择吗?
谢谢
答案 0 :(得分:10)
import java.util.ArrayDeque
var stack = ArrayDeque<Int>()
stack.push(1)
stack.push(2)
stack.push(3)
stack.push(4)
println(stack) // --> [4, 3, 2, 1]
println(stack.isEmpty()) // --> false
println(stack.peek()) // --> 4
println(stack) // --> [4, 3, 2, 1]
println(stack.pop()) // --> 4
println(stack) // --> [3, 2, 1]
stack.push(9)
println(stack) // --> [9, 3, 2, 1]
答案 1 :(得分:8)
这与在Java中使用的方式相同,但使用Kotlin语法 - val
关键字与缺少新关键字明显不同。例如:
import java.util.Stack
...
val someList = ArrayList()
...
val stack = Stack()
stack.addAll(someList)
答案 2 :(得分:7)
这已经有几年历史了,但我怀疑还有其他方法的空间。如果您想在Kotlin中使用堆栈结构,则肯定不需要诉诸Java。您可以轻松地创建一个带有内部Kotlin列表和类似堆栈的公共函数的新类,或者使用Kotlin的扩展方法为现有的Kotlin集合提供“类似堆栈”的功能,例如:
fun <T> MutableList<T>.push(item: T) = this.add(this.count(), item)
fun <T> MutableList<T>.pop(): T? = if(this.count() > 0) this.removeAt(this.count() - 1) else null
fun <T> MutableList<T>.peek(): T? = if(this.count() > 0) this[this.count() - 1] else null
fun <T> MutableList<T>.hasMore() = this.count() > 0
然后,可选地,您可以使用typealias使使用这些功能时要执行的操作更加明显:
typealias Stack = MutableList<MyClass>
然后创建一个并使用它:
val myStack: Stack = mutableListOf()
myStack.push(MyClass())
myStack.pop()
等
答案 3 :(得分:5)
您可以使用以下内容:
/**
* Stack as type alias of Mutable List
*/
typealias Stack<T> = MutableList<T>
/**
* Pushes item to [Stack]
* @param item Item to be pushed
*/
inline fun <T> Stack<T>.push(item: T) = add(item)
/**
* Pops (removes and return) last item from [Stack]
* @return item Last item if [Stack] is not empty, null otherwise
*/
fun <T> Stack<T>.pop(): T? = if (isNotEmpty()) removeAt(lastIndex) else null
/**
* Peeks (return) last item from [Stack]
* @return item Last item if [Stack] is not empty, null otherwise
*/
fun <T> Stack<T>.peek(): T? = if (isNotEmpty()) this[lastIndex] else null
答案 4 :(得分:4)
我不相信Kotlin中有Stack的特定单独实现。你绝对可以使用Ed的答案。
或者,您可以使用mutableListOf<DataType>
构造,然后使用自定义方法。
这将是这样的:
var stackDemo = mutableListOf<String>()
推送元素
var count = stackDemo.count()
stackDemo.add(count,"One")
弹出元素
var count = stackDemo.count()
stackDemo.removeAt(count)
您可以参考此Github link获取模型实现
答案 5 :(得分:3)
你可以像它一样定义Stack。
val stack = Stack<YourStackType>()
注意设置堆栈的数据类型,例如Int的堆栈是这样的:
val stack = Stack<Int>()
之后,您可以使用推送,弹出或其他堆栈操作
Int堆栈的示例:
a:Int = 10
stack.push(a)
a = stack.pop()
答案 6 :(得分:2)
Kotlin 1.3.70 引入了 kotlin.collections.ArrayDeque
类,它既用作队列又用作堆栈,就像 Java 的 java.util.Deque
(Deque 意思是“双端队列”)。它是出于多平台 ArrayDeque
实施的需要而创建的。
val stack = ArrayDeque(listOf(1, 2, 3)) // stack: [1, 2, 3]
stack.addLast(0) // stack: [1, 2, 3, 0] (push)
val value = stack.removeLast() // value: 0, stack: [1, 2, 3] (pop)
请注意,如果调用 removeFirst
或 removeLast
时 ArrayDeque
为空,它将抛出 kotlin.NoSuchElementException
。如果您不想在每次需要访问时检查双端队列的大小,那么您应该使用 removeFirstOrNull
和 removeLastOrNull
函数。
可选片段
ArrayDeque
构造函数:
inline fun <T> arrayDequeOf(vararg elements: T) = ArrayDeque(elements.toList())
// ...
val stack = arrayDequeOf(1, 2, 3)
Stack
之类的 ArrayDeque
调用:
inline fun <T> ArrayDeque<T>.push(element: T) = addLast(element) // returns Unit
inline fun <T> ArrayDeque<T>.pop() = removeLastOrNull() // returns T?