如果假设P30012 = C300023 - C30145+C30123;P30013 = C300025 - C30145+C30129 
(C301790860/C301790858)((C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549-C301120560-C301120561-C301120562-C301120563-C301120564-C301120565-C301120566-C301120567)/(C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549)) 
变成了 
P300012*P30013*(C301790860/C301790858)((C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549-C301120560-C301120561-C301120562-C301120563-C301120564-C301120565-C301120566-C301120567)/(C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549)) 
//
这里P开头的可能不止2个,可能有很多个
怎么把C开头的全解析出来呢?附原帖地址:http://topic.csdn.net/u/20090612/21/e071246e-d691-40ae-a057-52d849621a3d.html?seed=2085711641
内容:我有1个公式 他可能现在这样的 
(C301790860/C301790858)((C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549-C301120560-C301120561-C301120562-C301120563-C301120564-C301120565-C301120566-C301120567)/(C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549)) 都是C开头的然后后面一堆数字,这些计数进行运算,还有还有可能重复 我想把里面的C301790860  C301790858 C301120543等等解析出来,重复的只要1个,谢谢 

解决方案 »

  1.   

    把用'C'和运算符号作为分割标记将他们解析出来,放到SET中
      

  2.   

    楼主看看这样行不行
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;public class SplitString { /**
     * @param args
     */
    public static void main(String[] args) {
    String s = "P300012*P30013*(C301790860/C301790858)((C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549-C301120560-C301120561-C301120562-C301120563-C301120564-C301120565-C301120566-C301120567)/(C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549))";
    String[] str = s.split("\\+|\\-|\\*|\\/|\\(|\\)");
    Set stringSet = new HashSet();
    for(int i=0; i < str.length; i++){
    if(str[i] != "" && str[i].startsWith("C")){
    stringSet.add(str[i]);
    }
    }
    Iterator iter = stringSet.iterator();
    while(iter.hasNext()){
    System.out.println(iter.next()); }
    }}
      

  3.   

    import java.util.regex.*;
    import java.util.*;public class ExtractC{
    public static void main(String[] args){
    String s="P30012 = C300023 - C30145+C30123;P30013 = C300025 - C30145+C30129(C301790860/C301790858)((C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549-C301120560-C301120561-C301120562-C301120563-C301120564-C301120565-C301120566-C301120567)/(C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549))";
    System.out.println(extract(s));
    }    public static Set<String> extract(String s){
         HashSet<String> hs=new HashSet<String>();
         Pattern p=Pattern.compile("C\\d+");
         Matcher m=p.matcher(s);
         while(m.find()){
         hs.add(m.group());
         }
         return hs;
        }
    }
      

  4.   


        public static void main(String[] args) throws Exception {
            String str = "(C301790860/C301790858)((C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549-C301120560-C301120561-C301120562-C301120563-C301120564-C301120565-C301120566-C301120567)/(C301120543+C301120544+C301120545+C301120546+C301120547+C301120548+C301120549))";        StringTokenizer st = new StringTokenizer(str ,"C()/+-");        while(st.hasMoreTokens()){
                System.out.println(st.nextToken());
            }    }
    所有数字可以提出来..要计算的话我就一点也不行了.我算法是零
      

  5.   

    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test {

    /**
     * 获得所有以C开发头的不重复的数据
     * @param s
     * @return Iterator
     */
    public static Iterator getIteratorStringC(String s){
    //map的key值不能重复 重复数据自动覆盖
    Map map = new HashMap();
    //匹配以C开头的  或者用C或P开头[CP][0-9]
    Pattern p = Pattern.compile("[C][0-9]+");
    Matcher m = p.matcher(s);
    while(m.find()){
    map.put(m.group(), null);
    }

    return  map.keySet().iterator();
    }
    /**
     * 获得所有P开发头的不重复的数据
     * @param s
     * @return Iterator
     */
    public static Iterator getIteratorStringP(String s){
    //map的key值不能重复 重复数据自动覆盖
    Map map = new HashMap();
    //匹配以C开头的  或者用C或P开头[CP][0-9]
    Pattern p = Pattern.compile("[P][0-9]+");
    Matcher m = p.matcher(s);
    while(m.find()){
    map.put(m.group(), null);
    }

    return  map.keySet().iterator();
    }
    //测试
    public static void main(String[] ar){
    String testString = "(C301790860/C301790858)" +
    "((C301120543+C301120544+C301120545+" +
    "C301120546+C301120547+C301120548+C301120549-C301120560" +
    "-C301120561-C301120562-C301120563-" +
    "C301120564-C301120565-C301120566-C301120567)/" +
    "(C301120543+C301120544+C301120545+C301120546+" +
    "C301120547+C301120548+C301120549))";
    Iterator ite = getIteratorStringC(testString);
    while(ite.hasNext()){
    System.out.println(ite.next().toString());
    }
    }
    }
      

  6.   

    兄弟,你的意思先把C开头取出来,然后再去P开头然后里面的C开头取出来然后加到之前的那个map里?
      

  7.   


     /**
         * 获得所有以C开发头的不重复的数据
         * @param s
         * @return Iterator
         */
        public static Iterator getIteratorStringC(String s){
    无论什么字符串都可以取到,这个方法只要你输入一个String,其他不管
    把所有的都String都连起来也可以取到啊 
      

  8.   


    /**
     * 获得所有以C开发头的不重复的数据
     * @param s
     * @return Object[]
     */
    public static Object[] getIteratorStringC(String s){
    // map的key值不能重复 重复数据自动覆盖
    Map map = new HashMap();
    //匹配以C开头的  或者用C或P开头[CP][0-9]
    Pattern p = Pattern.compile("[C][0-9]+");
    Matcher m = p.matcher(s);
    while(m.find()){
    map.put(m.group(), null);
    }

    Object a[] = (map.keySet().toArray());
    //排序
    Arrays.sort(a);
    return a;
    }
    //测试
    public static void main(String[] ar){
    String testString = "P300012*P30013*(C301790860/C301790858)" +
    "((C301120543+C301120544+C301120545+" +
    "C301120546+C301120547+C301120548+C301120549-C301120560" +
    "-C301120561-C301120562-C301120563-C301120564-" +
    "C301120565-C301120566-C301120567)/(C301120543+" +
    "C301120544+C301120545+C301120546+C301120547+" +
    "C301120548+C301120549)) ";
    String pstring1="P30012 = C300023 - C30145+C30123";
    String pstring2="P30013 = C300025 - C30145+C30129"; 
    Object ite[] = getIteratorStringC(testString+pstring1+pstring2);

    for(int i = 0;i<ite.length;i++){

    System.out.println(""+ite[i]);
    }
    }
    输出
    C300023
    C300025
    C301120543
    C301120544
    C301120545
    C301120546
    C301120547
    C301120548
    C301120549
    C301120560
    C301120561
    C301120562
    C301120563
    C301120564
    C301120565
    C301120566
    C301120567
    C30123
    C30129
    C30145
    C301790858
    C301790860
      

  9.   

    直接用treemap好像就可以了,谢谢。是吗?
      

  10.   

    treemap感觉效率不高每取得一个放到MAP里面排一次不如全部取出来排一次