java对含未知数X的二进制数据进行切割

切割的方法和代码我不会用,有偿求程序演示

img


不带X的数据切割规则就是,连续的1遇0结束,连续的0遇1结束
例如101110 切割后就是10 1110

img


带X的数据是X出现在切割首位,则X取值为X后面的数字
上图X就取值0

img


X出现的切割中间,则X取X前的数字
上图X就是1后的X取1,0后的X取0
取值后就可以进行上述不带X切割的步骤

img


这是我的思路,但是切割这块我搞不明白怎么弄

供参考

import com.sun.deploy.security.SelectableSecurityManager;

public class Main {

    /**
     * 在源数据中将指定字符替换成最后的数字
     * @param sourceData
     * @param repalceChar
     * @param index
     * @return
     */
    public static String replaceDataFromTail(String sourceData, String repalceChar,int index) {
        if (!sourceData.substring(index, index + 1).equals(repalceChar))
            return sourceData.replaceFirst(repalceChar, sourceData.substring(index, index+1));
        if (sourceData.substring(index, index + 1).equals(repalceChar)&& (index== sourceData.length()-1))
            return sourceData.replaceFirst(repalceChar, sourceData.substring(index, index+1));
        return replaceDataFromTail(sourceData, repalceChar,index+1);
    }

    /**
     * 在源数据中用前面的数字替换指定字符
     * @param sourceData
     * @param repalceChar
     * @param index
     * @return
     */
    public static String replaceDataFromHead(String sourceData, String repalceChar,int index) {
        if (index> sourceData.length()-1)
            return  sourceData;
        if (!sourceData.substring(index,index+1).equals(repalceChar))
            return sourceData;
        String prevOneChar= "";
        String prevTwoChar= "";
        String prevThreeChar= "";
        switch (index)
        {
            case 0:
                break;
            case 1:
                prevOneChar = sourceData.substring(index - 1, index);
                sourceData = sourceData.replaceFirst(repalceChar, prevOneChar);
                sourceData = replaceDataFromHead(sourceData, repalceChar, index + 1);

                break;
            case 2:
                    prevOneChar = sourceData.substring(index - 1, index);
                    prevTwoChar= sourceData.substring(index-2, index-1);
                    if(prevOneChar.equals(prevTwoChar)) {
                        sourceData = sourceData.replaceFirst(repalceChar, prevOneChar);
                        sourceData = replaceDataFromHead(sourceData, repalceChar, index + 1);
                    }
                    else
                    {
                        return replaceDataFromTail(sourceData,repalceChar,index);
                    }

                break;

            default:{
                    prevOneChar = sourceData.substring(index - 1, index);
                    prevTwoChar= sourceData.substring(index-2, index-1);
                    prevThreeChar= sourceData.substring(index-3, index-2);
                    if ((!prevThreeChar.equals(prevTwoChar)|| prevTwoChar.equals(prevOneChar))&&(!prevOneChar.equals(repalceChar)))
                    {
                        sourceData= sourceData.replaceFirst(repalceChar, prevOneChar);
                        sourceData= replaceDataFromHead(sourceData,repalceChar,index+1);
                    }
                    else
                    {
                        return replaceDataFromTail(sourceData,repalceChar,index);
                    }
            }
        }
        return sourceData;
    }
    /**
     *  根据规则拆分指定字符串
     * @param sourceData
     * @return
     */
    public static String splitData(String sourceData, String repalceChar)
    {
        String tmpData= "";
        int startIndex= -1;
        for (int index=0;index< sourceData.length();index++){

            if (sourceData.substring(index,index+1).equals(repalceChar)) {
                    sourceData= replaceDataFromHead(sourceData,repalceChar,index);
            }
            if (startIndex==-1) {
                startIndex = index;
                continue;
            }
            if (!sourceData.substring(index,index+1).equals(sourceData.substring(index-1,index)))
            {
                      tmpData= tmpData+" "+ sourceData.substring(startIndex,index+1);
                      startIndex= -1;
            }
        }
        if (startIndex!= -1)
        {
            tmpData= tmpData+" "+ sourceData.substring(startIndex,sourceData.length());
        }
        return tmpData;
    }

    public static void main(String[] args){
        String sourceInfo= "111101XXX011XXXX0XX";
        System.out.println("源数据:"+ sourceInfo);
        String replaceInfo= splitData(sourceInfo,"X");
        System.out.println("替换后数据:"+ replaceInfo);
    }
}


https://blog.csdn.net/weixin_39553458/article/details/113083202

二进制,本身不就是0-1,哪里来的X;;;;

这个道理,我不是很明白;

二进制中,除了0和1,还有第三数,那就不是二进制了


public class Text02 {
    //将字符结合
    public static String combine(String str1, char str2) {
        String new_string = str1 + str2;
        return new_string;
    }


    //将字符串加入到列表
    public static String[] AddArray(String[] arr, String string) {
        int length = arr.length;
        String[] new_arr = new String[length + 1];
        for (int i = 0; i < length; i++) {
            new_arr[i] = arr[i];
        }
        new_arr[length] = string;
        return new_arr;
    }

    public static String[] split(String string) {
        int length = string.length();
        String[] arr = new String[0];
        String new_string = "";
        int i = 1;
        while (i < length) {
            new_string = combine(new_string, string.charAt(i - 1));
            if (string.charAt(i - 1) != string.charAt(i)) {
                new_string = combine(new_string, string.charAt(i));
                arr = AddArray(arr, new_string);
                new_string = "";
                i += 1;
            }
            if (i == length - 1) {
                new_string = combine(new_string, string.charAt(i));
            }
            i = i + 1;
        }
        arr = AddArray(arr, new_string);
        int arr_length = arr.length;
        for (int j = 0; j < arr_length; j++) {
            for (int k = 1; k < arr[j].length() - 1; k++) {
                if (arr[j].charAt(k) == 'X' && arr[j].charAt(k - 1) != 'X') {
                    System.out.println("aaaaa");
                    String a = arr[j];
                    a = a.replace('X', arr[j].charAt(k - 1));
                    arr[j] = a;
                }
            }
        }
        for (int j = 0; j < arr_length; j++) {
            System.out.println(arr[j]);
        }
        return arr;
    }

    public static void main(String[] args) {
        String a4 = "101110";
        String a1 = "1011100000000100011110000000010000000011";
        String a2 = "1110XXXXXXXXXXXXXXXXXXXXXXXXXXXXX000001";
        String a3 = "11111XXXXXXXXXXXXXXXXXX0XXXXXX111111111";
        String[] result_arr = split(a3);
    }
}

img


切分了,但不太明白你的X的转换规则