Java 使用排序的linkedList实现多集

Java 使用排序的linkedList实现多集,java,linked-list,multiset,Java,Linked List,Multiset,您好,我使用linkedlist实现了一个多集,我想使用排序linkedlist实现多集。这是一个多集抽象类 import java.io.PrintStream; public abstract class Multiset<T> { /** * Delimiter string for print operation. */ protected static final String printDelim = " | "; publ

您好,我使用linkedlist实现了一个多集,我想使用排序linkedlist实现多集。这是一个多集抽象类

import java.io.PrintStream;

public abstract class Multiset<T> {
    /**
     * Delimiter string for print operation.
     */
    protected static final String printDelim = " | ";

    public abstract void add(T item);

    public abstract int search(T item);

    public abstract void removeOne(T item);

    public abstract void removeAll(T item);

    public abstract void print(PrintStream out);
} 
导入java.io.PrintStream;
公共抽象类多集{
/**
*用于打印操作的分隔符字符串。
*/
受保护的静态最终字符串printDelim=“|”;
公开摘要作废增加(T项);
公共摘要检索(T项);
公开摘要作废一份(T项);
公开摘要无效删除(T项);
公开摘要作废打印(打印流输出);
} 
这是我对linkedlist的实现

import java.io.PrintStream;

public class LinkedListMultiset<T> extends Multiset<T> {
    protected Node mHead;
    protected int mLength;

    public LinkedListMultiset() {
        // Implement me!
        mHead = null;
        mLength = 0;
    }

    public void add(T item) {
        Node newNode = new Node((String) item);
        if (mHead == null)
            mHead = newNode;
        else {
            Node currNode = mHead;
            Node parentNode = null;
            while (currNode != null) {
                if (currNode.getValue().
                        equals(newNode.getValue())) {
                    currNode.addCounter();
                    return;
                }
                parentNode = currNode;
                currNode = currNode.getNext();
            }
            parentNode.setNext(newNode);
        }
        mLength++;
    }

    public int search(T item) {
        Node currNode = mHead;

        while (currNode != null) {
            if (currNode.getValue().equals((String) item)) {
                return currNode.getCounter();
            }
            currNode = currNode.getNext();
        }

        return 0;
    }

    public void removeOne(T item) {
        Node currNode = mHead;
        Node lastNode = null;

        while (currNode != null) {
            if (currNode.getValue().equals((String) item)) {
                currNode.minusCounter();
                if (currNode.getCounter() == 0) {
                    if (currNode == mHead)
                        mHead = currNode.getNext();
                    else
                        lastNode.setNext
                                (currNode.getNext());
                    mLength--;
                }
                return;
            }
            lastNode = currNode;
            currNode = currNode.getNext();
        }
    }

    public void removeAll(T item) {
        Node currNode = mHead;
        Node lastNode = null;

        while (currNode != null) {
            if (currNode.getValue().equals((String) item)) {
                if (currNode == mHead)
                    mHead = currNode.getNext();
                else
                    lastNode.setNext(currNode.getNext());
                mLength--;
                return;
            }
            lastNode = currNode;
            currNode = currNode.getNext();
        }
    }

    public void print(PrintStream out) {
        Node currNode = mHead;

        while (currNode != null) {
            out.printf("%s | %d\n", currNode.getValue()
                    , currNode.getCounter());
            currNode = currNode.getNext();
        }
    }

    private class Node {
        protected String mValue;
        protected Node mNext;

        int counter;

        public Node(String value) {
            mValue = value;
            mNext = null;
            counter = 1;
        }

        public void addCounter() {
            counter++;
        }

        public void minusCounter() {
            counter--;
        }

        public int getCounter() {
            return counter;
        }

        public String getValue() {
            return mValue;
        }

        public Node getNext() {
            return mNext;
        }

        public void setValue(String value) {
            mValue = value;
        }

        public void setNext(Node next) {
            mNext = next;
        }
    }
}
导入java.io.PrintStream;
公共类LinkedListMultiset扩展了Multiset{
受保护节点mHead;
保护长度;
公共LinkedListMultiset(){
//实施我!
mHead=null;
mLength=0;
}
公共作废新增(T项){
Node newNode=新节点((字符串)项);
if(mHead==null)
mHead=newNode;
否则{
节点currNode=mHead;
节点parentNode=null;
while(currNode!=null){
if(currNode.getValue()。
等于(newNode.getValue()){
currNode.addCounter();
返回;
}
parentNode=currNode;
currNode=currNode.getNext();
}
parentNode.setNext(newNode);
}
mLength++;
}
公共整数搜索(T项){
节点currNode=mHead;
while(currNode!=null){
if(currNode.getValue().equals((字符串)项)){
返回currNode.getCounter();
}
currNode=currNode.getNext();
}
返回0;
}
公共无效删除一项(T项){
节点currNode=mHead;
Node lastNode=null;
while(currNode!=null){
if(currNode.getValue().equals((字符串)项)){
currNode.minusCounter();
if(currNode.getCounter()==0){
if(currNode==mHead)
mHead=currNode.getNext();
其他的
lastNode.setNext
(currNode.getNext());
最大长度--;
}
返回;
}
lastNode=currNode;
currNode=currNode.getNext();
}
}
公共作废移除所有(T项){
节点currNode=mHead;
Node lastNode=null;
while(currNode!=null){
if(currNode.getValue().equals((字符串)项)){
if(currNode==mHead)
mHead=currNode.getNext();
其他的
setNext(currNode.getNext());
最大长度--;
返回;
}
lastNode=currNode;
currNode=currNode.getNext();
}
}
公共作废打印(打印流输出){
节点currNode=mHead;
while(currNode!=null){
out.printf(“%s |%d\n”,currNode.getValue()
,currNode.getCounter());
currNode=currNode.getNext();
}
}
私有类节点{
受保护字符串值;
受保护节点mNext;
整数计数器;
公共节点(字符串值){
mValue=值;
mNext=null;
计数器=1;
}
公共无效addCounter(){
计数器++;
}
公共柜台(){
计数器--;
}
公共int getCounter(){
返回计数器;
}
公共字符串getValue(){
返回mValue;
}
公共节点getNext(){
返回mNext;
}
公共void设置值(字符串值){
mValue=值;
}
公共void setNext(节点next){
mNext=next;
}
}
}

我想实现排序的linkedlist,但我想尽可能少地更改代码。

应该排序什么?列表或列表中的值(尽管我假设它们基本相等)?为什么不将
TreeSet
与适当的
比较器一起使用呢?@Thomas值将被排序。不,我不想用树集。我必须使用排序的LinkedList来实现它。我不太确定我是否正确理解了您的需求:从您的代码来看,您似乎只是在实现一个链接列表,但将其命名为“set”。所以它基本上是一个排序的链表,你在寻找?在这种情况下,您可以实现search方法,以便它返回一个与传递的项相等的节点,或者如果不存在这样的节点,则返回下一个更高/更低的节点。添加新项目时,首先进行搜索,并在节点返回之前/之后添加新项目。如果搜索返回null(没有更高/更低的节点),则在末尾/前面添加该项。@Thomas,因此我只需要更改add方法,其余代码使用SortedLinkedList基本上是的,将add方法更改为以排序方式插入节点。顺便说一句,我想您的搜索方法不应该返回0,但如果找到,可能会返回项目的索引。您可以创建一个内部搜索方法来支持
search()
add()
,因为这基本上是相同的方法。