有诸如这样的字符串:
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..... 输入的字符串有可能会很大,几十兆,甚至上百兆,如何写这个算法,能有效的进行处理。。 请帮忙!
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..... 输入的字符串有可能会很大,几十兆,甚至上百兆,如何写这个算法,能有效的进行处理。。 请帮忙!
话最终的结果是:
A~|~B~|~C~%~D~|~E~|~F~|~G~@~4~|~5~|~6~|~7~%~H~|~I.....这样的不?
其次,我想问,几百M的字符串,楼主放到哪,都读到内存里不现实,假如分批次的话,
对你要的结果肯定有啥影响
话最终的结果是:
A~|~B~|~C~%~D~|~E~|~F~|~G~@~4~|~5~|~6~|~7~%~H~|~I.....怎么生成的?
首先,没看懂,楼主能解释一下为啥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.....这样的不?
其实就是多行记录并成一行
H~|~I相同关键字段
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.....
其中~%~为关键字段和重复数据的分割 关键字段的个数和位置未定,有可能的字符串是如:
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.....重新编辑了一下。
源串中I后面少了个~分隔符
A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I~@~
A~|~B~|~C~|~4~|~5~|~6~|~7~|~H~|~I
这样两行数据,关键字段就应该是ABC和HI.....
A~|~B~|~C~%~D~|~E~|~F~|~G~#~4~|~E~|~6~|~7~%~H~|~I
关键字段只存在一行记录的最前面和最后面。
如果中间都出现的,存储过程很难做到吧
~@~A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I如果是这样的串呢?
> 输入的字符串有可能会很大,几十兆,甚至上百兆,如何写这个算法,能有效的进行处理。。 打个比方,
A~|~B~|~C~|........中间100M字节和ABC没关系,也不换行.......但是最后......A~|~B~|~C~|
绝对是个悲剧。
2.还是说A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I算一行,@~A~|~B~|~C~|~4~|~5~|~6~|~7~|~H~|~I算一行?@有多个?如果有100行,怎么合并,100行合一起?
是这样的:A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I算一行,@~A~|~B~|~C~|~4~|~5~|~6~|~7~|~H~|~I算一行。@有多个。
比较每一行的关键字段,相同的合并。。关键字段只能出现在首尾
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个相同的字符,中间那些排过序的位置上的字符也肯定相同。至于说怎么分那个分行符号那就随意了,按你的要求怎么地都要把所有数据读入内存吧?