Java 使用排序的linkedList实现多集
您好,我使用linkedlist实现了一个多集,我想使用排序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
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()
,因为这基本上是相同的方法。