有诸如这样的字符串: 
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..... 输入的字符串有可能会很大,几十兆,甚至上百兆,如何写这个算法,能有效的进行处理。。 请帮忙! 

解决方案 »

  1.   

    首先,没看懂,楼主能解释一下为啥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.....这样的不?
    其次,我想问,几百M的字符串,楼主放到哪,都读到内存里不现实,假如分批次的话,
    对你要的结果肯定有啥影响
      

  2.   

    这个根本没看出规律来呀。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.....怎么生成的?
      

  3.   

    [Quote=引用 4 楼 valen_jia 的回复:]
    首先,没看懂,楼主能解释一下为啥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.....这样的不?
    其实就是多行记录并成一行
      

  4.   

    A~|~B~|~C相同关键字段
    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..... 有相同关键字段的多行记录
      

  5.   

    A~|~B~|~C~%~D~|~E~|~F~|~G~@~4~|~5~|~6~|~7~%~H~|~I并成一行怎么还有分行符?
      

  6.   

    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.....重新编辑了一下。
      

  7.   

    要比较源串中每一行的数据。
    源串中I后面少了个~分隔符
    A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I~@~
    A~|~B~|~C~|~4~|~5~|~6~|~7~|~H~|~I
    这样两行数据,关键字段就应该是ABC和HI.....
      

  8.   

    A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I~@~A~|~B~|~C~|~4~|~E~|~6~|~7~|~H~|~I这样的串,最终应该是什么?
      

  9.   

    这样的就应该是
    A~|~B~|~C~%~D~|~E~|~F~|~G~#~4~|~E~|~6~|~7~%~H~|~I
    关键字段只存在一行记录的最前面和最后面。
    如果中间都出现的,存储过程很难做到吧
      

  10.   

    怎么又涉及到存储过程?你到底打算是用JAVA还是用数据库?
      

  11.   

    现在的情况是不可能去修改存储过程,只能用java对存储过程产生的这样的串进行处理
      

  12.   

    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如果是这样的串呢?
      

  13.   

    还是又不明白的地方,若是关键字段在中间怎么办?如A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I~@~2~|~3~|~C~|~D~|~E~|~6~|~7~|~A~|~C
      

  14.   

    之所以我1F问你能不能改,因为你说:
    > 输入的字符串有可能会很大,几十兆,甚至上百兆,如何写这个算法,能有效的进行处理。。 打个比方,
    A~|~B~|~C~|........中间100M字节和ABC没关系,也不换行.......但是最后......A~|~B~|~C~|
    绝对是个悲剧。
      

  15.   

    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行合一起?
      

  16.   


    是这样的:A~|~B~|~C~|~D~|~E~|~F~|~G~|~H~|~I算一行,@~A~|~B~|~C~|~4~|~5~|~6~|~7~|~H~|~I算一行。@有多个。
    比较每一行的关键字段,相同的合并。。关键字段只能出现在首尾
      

  17.   

    发个我写的吧,不知道你是这个意思不。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个相同的字符,中间那些排过序的位置上的字符也肯定相同。至于说怎么分那个分行符号那就随意了,按你的要求怎么地都要把所有数据读入内存吧?