我写了一个LinkedList
类,接受存储Nodes
的{{1}}。
我创建了一个Integers
,如果LinkedList stack = new LinkedList()
的数据小于Node
的数据,则已添加Node
已存在于此Node
。
如果没有,我想将旧的stack
放入名为stack
的新LinkedList
中,并创建名为LinkedList pilesOfStacks
的{{1}},并添加此newStack
中的LinkedList newStack = new LinkedList()
更大,也会进入Node
。
我的问题是;由于我已经创建了newStack
课程来接受LinkedList pilesOfStacks
,因此我如何让它成为新的LinkedList
来接受Node
LinkedList
的{{1}} LinkedList
中有Nodes
个不同的堆?
这是我到目前为止所做的:
LinkedList
编辑:如果我可以使用数组,我会创建一个双重数组到效果LinkedList
,然后用public void sort(LinkedList listOfInts)
{
LinkedList<LinkedList> piles = new LinkedList<LinkedList>();
LinkedList stack = new LinkedList();
for(int i = 0; i < listOfInts.getSize(); i++)
{
Node x = listOfInts.pop();
for(int j = 0; j < piles.getSize(); j++)
{
Node y = piles.peek(); //check first element of each pile
if( ( ((Comparable)y.getData()).compareTo(x.getData()) ) <= 0)
{
stack.push(x);
break;
}
}
stack.push(x); //put value in stack
piles.add(stack);
}
}
搜索它,但因为我只能使用Node[][] array = new Node[20][20];
,我想知道怎么做?
答案 0 :(得分:2)
好的,我只是试了一下 - 使用 Kami 和 Roman C 提到的Java Collection Framework。为了避免混淆,我总是使用所涉及的接口/类的完全限定名称 - ,即使这会使代码看起来大而丑陋。
我使用java.util.LinkedList
来实现java.util.List
以及java.util.Deque
接口。后者为您提供了将其视为堆栈的方法。
我假设您从方法名称中确实想要对堆栈中的节点进行排序。为此我必须更改原始示例的某些部分,因为它似乎没有像您描述的那样。
我最终得到了您的示例的以下变体:
public void sort(java.util.Deque<Node> stackOfIntNodes) {
java.util.List<java.util.Deque<Node>> piles =
new java.util.LinkedList<java.util.Deque<Node>>();
java.util.Deque<Node> currentStack = new java.util.LinkedList<Node>();
inputLoop : while (!stackOfIntNodes.isEmpty()) {
Node currentNode = stackOfIntNodes.pop();
for (java.util.Deque<Node> singlePile : piles) {
// check first element of each pile
Node smallestNodeInSinglePile = singlePile.peek();
Object valueOfSmallestNodeInSinglePile =
smallestNodeInSinglePile.getData();
if ((((java.lang.Comparable) valueOfSmallestNodeInSinglePile)
.compareTo(currentNode.getData())) <= 0) {
singlePile.push(currentNode);
continue inputLoop;
}
}
piles.add(currentStack);
currentStack = new java.util.LinkedList<Node>();
currentStack.push(currentNode); // put value in stack
}
piles.add(currentStack);
java.util.Deque<Node> sortedStackOfIntNodes = new java.util.LinkedList<Node>();
for (java.util.Deque<Node> singlePile : piles) {
while (!singlePile.isEmpty()) {
sortedStackOfIntNodes.push(singlePile.pop());
}
}
// RESULT: you got all your Node elements in sorted order
}
但如果您真的使用java.util.LinkedList
而不是自己的实现,则可以轻松使用此等效方法:
public void sort(java.util.Deque<Node> stackOfIntNodes) {
java.util.LinkedList<Node> sortedListOfIntNodes =
new java.util.LinkedList<Node>(stackOfIntNodes);
java.util.Collections.sort(sortedListOfIntNodes,
new Comparator<Node>() {
@Override
public int compare(Node nodeOne, Node nodeTwo) {
return ((java.lang.Comparable) nodeOne.getData())
.compareTo(nodeTwo.getData());
}
});
// RESULT: you got all your Node elements in sorted order
}
根据您的实际Node类和/或自己的LinkedList,您可能需要在此处应用进一步的更改。