求一字符串处理算法

boryce 2010-05-19 03:44:30
有诸如这样的字符串:
A~|~B~|~C~|~D~|~E~|~F~|~G~@~A~|~B~|~C~|~4~|~5~|~6~|~7.....
~|~为列分隔符,~@~为行分隔符
最终要生成A~|~B~|~C~%~D~|~E~|~F~|~G~@~4~|~5~|~6~|~7.....
其中~%~为关键字段和重复数据的分割

关键字段的个数和位置未定,有可能的字符串是如:
A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I@~A~|~B~|~C~|~4~|~5~|~6~|~7~|~H~|~I.....
这样的话最终的结果要求是:
A~|~B~|~C~%~D~|~E~|~F~|~G~@~4~|~5~|~6~|~7~%~H~|~I.....

输入的字符串有可能会很大,几十兆,甚至上百兆,如何写这个算法,能有效的进行处理。。

请帮忙!
...全文
416 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
shine333 2010-05-20
  • 打赏
  • 举报
回复
之所以我1F问你能不能改,因为你说:
> 输入的字符串有可能会很大,几十兆,甚至上百兆,如何写这个算法,能有效的进行处理。。

打个比方,
A~|~B~|~C~|........中间100M字节和ABC没关系,也不换行.......但是最后......A~|~B~|~C~|
绝对是个悲剧。
boryce 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 werosh 的回复:]
1.A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I@~A~|~B~|~C~|~4~|~5~|~6~|~7~|~H~|~I算一行?@每行就一个,然后要把这行数据合并一下?
2.还是说A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I算一行,@~A~|~B~|~C~|~4~|~5~|~6~|~7~|~H~|~I算一行?@有多个?如果有100行,怎么合并,100行合……
[/Quote]

是这样的:A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I算一行,@~A~|~B~|~C~|~4~|~5~|~6~|~7~|~H~|~I算一行。@有多个。
比较每一行的关键字段,相同的合并。。关键字段只能出现在首尾
werosh 2010-05-20
  • 打赏
  • 举报
回复
1.A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I@~A~|~B~|~C~|~4~|~5~|~6~|~7~|~H~|~I算一行?@每行就一个,然后要把这行数据合并一下?
2.还是说A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I算一行,@~A~|~B~|~C~|~4~|~5~|~6~|~7~|~H~|~I算一行?@有多个?如果有100行,怎么合并,100行合一起?
boryce 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 shine333 的回复:]
之所以我1F问你能不能改,因为你说:
> 输入的字符串有可能会很大,几十兆,甚至上百兆,如何写这个算法,能有效的进行处理。。

打个比方,
A~|~B~|~C~|........中间100M字节和ABC没关系,也不换行.......但是最后......A~|~B~|~C~|
绝对是个悲剧。
[/Quote]

单行的数据绝对不会超过这么大,只有几K的样子
werosh 2010-05-20
  • 打赏
  • 举报
回复
数据结构太不合理了。如果数据不大,处理起来就几句话。关键是你好几百兆数据,肯定不能用字符串分割函数了,分一下就得卡死。。。这样就连分行那个符号都很难找出来了,更别说首位的重复字符了
shengyx 2010-05-20
  • 打赏
  • 举报
回复
嗯[Quote=引用 14 楼 boryce 的回复:]
引用 12 楼 quqiujie 的回复:
A~|~B~|~C~%~D~|~E~|~F~|~G~@~4~|~5~|~6~|~7~%~H~|~I

并成一行怎么还有分行符?

是的,因为要区别出来这个里面是嵌套的多行
[/Quote]
boryce 2010-05-20
  • 打赏
  • 举报
回复
谢谢了,先看看
werosh 2010-05-20
  • 打赏
  • 举报
回复
发个我写的吧,不知道你是这个意思不。
package com;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Compare {
private List<String> userlist;
public Compare(){

userlist=new ArrayList<String>();
userlist.add("A~|~B~|~C~|~D~|~E~|~F~|~G~|~6~|~7");
userlist.add("A~|~B~|~C~|~4~|~1~|~6~|~7");
userlist.add("A~|~B~|~D~|~E~|~F~|~G~|~3~|~6~|~7");
userlist.add("A~|~B~|~E~|~F~|~G~|~4~|~6~|~7");

}
@SuppressWarnings("unchecked")
public void Sort(){

FirstComparator fc = new FirstComparator();
Collections.sort(userlist, fc);

for (int i=0;i<userlist.size();i++){
String user_temp=(String)userlist.get(i);
System.out.println(user_temp);
}

String First = userlist.get(0);
String End = userlist.get(userlist.size()-1);

char[] FirstChar = First.toCharArray();
char[] EndChar = End.toCharArray();
int Length = FirstChar.length<=EndChar.length?FirstChar.length:EndChar.length;//谁短以谁为主
int sgin = 0;

for(;sgin<Length;sgin++){

if(FirstChar[sgin]!=EndChar[sgin]){//不相等跳出
break;
}

}

if(sgin==0){
System.out.print("没相同的");

}else{

String result = First.substring(0,sgin);//两个字符串哪个都成
System.out.println("头相同的字符为:"+result);
}



}
@SuppressWarnings("unchecked")
public void ReverseSort(){



EndComparator ec = new EndComparator();
Collections.sort(userlist, ec);

for (int i=0;i<userlist.size();i++){
String user_temp=(String)userlist.get(i);
System.out.println(user_temp);
}

String First = userlist.get(0);
String End = userlist.get(userlist.size()-1);

char[] FirstChar = First.toCharArray();
char[] EndChar = End.toCharArray();
int FirstLength = FirstChar.length;
int EndLength = EndChar.length;
int Length = FirstLength<=EndLength?FirstLength:EndLength;//谁短以谁为主
int sgin = 0;

for(;sgin<Length;sgin++){

if(FirstChar[FirstLength-1-sgin]!=EndChar[EndLength-1-sgin]){//不相等跳出
break;
}

}

if(sgin==0){
System.out.print("没相同的");

}else{
String result = First.substring(FirstLength-sgin,FirstLength);//两个字符串哪个都成
System.out.println("尾部相同的字符为"+result);
}


}

public static void main(String args[]){
Compare c = new Compare();
c.Sort();
System.out.println("--------------------------");
c.ReverseSort();
}
}


package com;

import java.util.Comparator;

public class FirstComparator implements Comparator {

public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
return ((String)o1).compareTo((String)o2);
}

}


package com;

import java.util.Comparator;

public class EndComparator implements Comparator {

public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub

return Reverse((String)o1).compareTo(Reverse((String)o2));
}
/**
* 反转字符串
* @param Str
* @return
*/
private String Reverse(String Str){
StringBuffer a=new StringBuffer(Str);
a.reverse();
return a.toString();

}
}

基本思路是用到了Collections的排序,排序后取第一个和最后一个,比较它们相同的字符。根据排序的原理,它们2个相同的字符,中间那些排过序的位置上的字符也肯定相同。至于说怎么分那个分行符号那就随意了,按你的要求怎么地都要把所有数据读入内存吧?
boryce 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 jiajerry0 的回复:]
还是又不明白的地方,若是关键字段在中间怎么办?如A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I~@~2~|~3~|~C~|~D~|~E~|~6~|~7~|~A~|~C
[/Quote]

关键字段只在前面或者只在后面,或者在前后。
jiajerry0 2010-05-19
  • 打赏
  • 举报
回复
还是又不明白的地方,若是关键字段在中间怎么办?如A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I~@~2~|~3~|~C~|~D~|~E~|~6~|~7~|~A~|~C
boryce 2010-05-19
  • 打赏
  • 举报
回复
sigh/......................
  • 打赏
  • 举报
回复
晕,看不懂,顶一下
boryce 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 quqiujie 的回复:]
A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I~@~A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I
~@~A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I

如果是这样的串呢?
[/Quote]
源串肯定是每一行数据都有效的。不会有完全重复的多行数据
紫炎圣骑 2010-05-19
  • 打赏
  • 举报
回复
A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I~@~A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I
~@~A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I

如果是这样的串呢?
boryce 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 jbz001 的回复:]
很奇怪的分隔符
[/Quote]
防止在数据串中可能出现一样的字符,呵呵
jbz001 2010-05-19
  • 打赏
  • 举报
回复
很奇怪的分隔符
boryce 2010-05-19
  • 打赏
  • 举报
回复
现在的情况是不可能去修改存储过程,只能用java对存储过程产生的这样的串进行处理
boryce 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 quqiujie 的回复:]
怎么又涉及到存储过程?

你到底打算是用JAVA还是用数据库?
[/Quote]
源串是通过业务系统的存储过程产生的
紫炎圣骑 2010-05-19
  • 打赏
  • 举报
回复
怎么又涉及到存储过程?

你到底打算是用JAVA还是用数据库?
boryce 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 quqiujie 的回复:]
A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I~@~A~|~B~|~C~|~4~|~E~|~6~|~7~|~H~|~I

这样的串,最终应该是什么?
[/Quote]
这样的就应该是
A~|~B~|~C~%~D~|~E~|~F~|~G~#~4~|~E~|~6~|~7~%~H~|~I
关键字段只存在一行记录的最前面和最后面。
如果中间都出现的,存储过程很难做到吧
加载更多回复(25)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧