去除一个字符串中的冗余字符

这个程序是用来去除一个字符串中的冗余字符的,我设计了两个数据结构,

一个是result(list类)用来记录结果,和原字符串的顺序一致,一个是sort(LinkedTable类)用来记录该字符串的字典序

对于每个新字符来说,如果它没有在字典序中出现,则它就是新元素加到结果集中,如果它出现在字典序中,则它就是冗余字符应该剔除不应该放在结果集中

判断有没有在字典序中有4个条件:

1、字典序为空,则为新元素;

2、字典序不为空,遍历该字典序,直到字典不再小于当前元素值或者遍历完整个链表停止;

3、若遍历完整个链表,则为新元素,并且是目前字典中最大的值;

4、若没有遍历完整个链表,则若是因为等于而停止,则为旧元素,若是因为大于而停止,则为新元素,将该元素加到适当的位置。

该程序对中文字符同样适用。

Java代码:

package A;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
//Node这个类是用来描述一个链表中的元素,包括两部分:数据和下一个元素的位置
class Node{
private String data;
private Node next;
public Node(String data){
this.data=data;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
//LinkedTable是链表类,包括一个头指针成员,函数有判断是否为空和判断当前值是否在链表中并且插入到相应的位置两个
class LinkedTable{
private Node head;
public LinkedTable(Node head){
this.head=head;
}
public boolean isEmpty() {
return head==null;
}
//链表中存储字典序,判断当前值是否在链表中,并且插入到相应的位置
public boolean containsAndinsert(String data){
Node newnode=new Node(data);
if(isEmpty()){
head=newnode;
return false;
}
else{
Node p = head;
Node pre = head;
while(p!=null&&p.getData().compareToIgnoreCase(data)<0){

pre=p;
p=p.getNext();


}
if(p==null){
pre.setNext(newnode);
return false;

}else if(p.getData().compareToIgnoreCase(data)>0){
//若是字典大于当前值,则将当前值插入到字典中,如果插入的位置为head,则要修改head指针,否则会出现
//Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
//因为按照正常的插入流程,p,pre,head指向同一个元素,该新元素和head组成了循环链表

newnode.setNext(p);
if(p==head)
head=newnode;
else
pre.setNext(newnode);
return false;

}
}
return true;

}
public String display(){
Node p=head;
StringBuffer sb=new StringBuffer();
while(p!=null){

sb.append(p.getData());
p=p.getNext();


}
return sb.toString();
}
public Node getHead() {
return head;
}
public void setHead(Node head) {
this.head = head;
}


}
/*这个程序是用来去除一个字符串中的冗余字符的,我设计了两个数据结构,
一个是result(list类)用来记录结果,和原字符串的顺序一致,一个是sort(LinkedTable类)用来记录该字符串的字典序
对于每个新字符来说,如果它没有在字典序中出现,则它就是新元素加到结果集中,如果它出现在字典序中,则它就是冗余字符应该剔除不应该放在结果集中
判断有没有在字典序中有4个条件:
1、字典序为空,则为新元素;
2、字典序不为空,遍历该字典序,直到字典不再小于当前元素值或者遍历完整个链表停止;
3、若遍历完整个链表,则为新元素,并且是目前字典中最大的值;
4、若没有遍历完整个链表,则若是因为等于而停止,则为旧元素,若是因为大于而停止,则为新元素,将该元素加到适当的位置。
该程序对中文字符同样适用。
by YXQ 20110329
*/
public class deteleredundancy {
public static void main(String[] args) {
String str[] = {"1","d","c","%","*","%","%","*","%","%","*","%"};
//System.out.println(deleteDouble(str));
deteleredundancy dr=new deteleredundancy();
//int a="a".compareToIgnoreCase("中");
//System.out.println(a);

dr.delete(str);
}

private void delete(String s[]){
List<String> result=new LinkedList<String>();
LinkedTable sort=new LinkedTable(null);



for (String ss:s) {

if(!sort.containsAndinsert(ss)){
result.add(ss);
}

}
System.out.println("This string's sort is :");
System.out.println(sort.display());
Iterator i=result.iterator();
StringBuffer sb=new StringBuffer();
while (i.hasNext()) {
sb.append(i.next().toString());
}
System.out.println("This string's result is :");
System.out.println(sb.toString());

}



}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值