排列后如何重新排列字符串

时间:2017-02-14 13:02:39

标签: java java-8

我正在使用以下代码根据特定表格置换字符串。

public static void main(String[] args) {

int[] IP = { 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
             62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 
             57, 49, 41, 33, 25, 17,  9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 
             61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 };


String text = "00000001 00100011 01000101 01100111 10001001 10101011 11001101 11101111".replace(" ", "");

 text = Permute(text,IP);   
 System.out.println(text);
}

public static String   Permute(String text,int [] table )
{
    String keys = "0" + text;

    StringBuilder sb = new StringBuilder ();

    for (int i = 1 ; i <= table.length; i++)
    {
        sb.append(keys.charAt(table[i-1]));
    }

    return sb.toString();
}

更新:有没有想过创建另一种方法来获取原始字符串?类似的东西:

public static String   GetoriginalText(String TextafterPermutation,int [] table ) 

4 个答案:

答案 0 :(得分:1)

在语句text = Permute(text,IP);中,您正在分配从String函数返回的Permute对象的引用,因此text变量所持有的原始引用将被返回的新引用替换通过Permute函数。

如果您想保留text所持有的原始参考,只需使用String output = Permute(text,IP);之类的任何其他变量。

您可以使用如下所述的简单程序:

public static String dePermute(String text, int[] table){

    String keys = text;

    System.out.println(table.length);
    String[] str = new String[table.length];

    for (int i = 1; i <= table.length; i++) {
        System.out.println("Coming "+table[i - 1]);
        str[table[i - 1]-1] = ""+keys.charAt(i-1);
        //sb.append(keys.charAt(table[i - 1]));
    }


    return Arrays.toString(str).replace("[", "").replace("]", "").replace(",", "").replace(" ", "");
}

您可以使用此计划中说明的概念。我刚刚在Permute函数中反转了您正在执行的过程。

答案 1 :(得分:1)

您可以使用根据表格映射填充的chararray

public static String RePermute(final String text, final int[] table) {
    final String keys = text;

    char[] chararray = new char[table.length];

    for (int i = 0; i < keys.length() && i < table.length; i++) {
        chararray[table[i]-1] = keys.charAt(i);
    }

    return new String(chararray);
}

此代码遍历您的文本,并将当前迭代的char写入表中指定的chararray位置。

注意:我的代码中存在一些问题,我保持不变。 例如,我真的不明白为什么你总是把#34; 0&#34;在你的文字前面。 此外,您可能希望处理传递的文本和表的长度不同的情况。

修改:我删除了您添加的部分&#34; 0&#34;在您传递的文本前面,而是将循环更改为从i = 0开始,而不是i = 1.

答案 2 :(得分:1)

您可以简化算法以使用字符数组而不是StringBuilder

public static String permute(String text,int [] table )
{
    char[] chars = new char[table.length];
    for (int i = 0 ; i < table.length; i++) {
        chars[i] = text.charAt(table[i]-1);
    }

    return new String(chars);
}

之后反向算法更加明显。你只需要进行反向分配:

public static  String undo(String text,int [] table ) {
    char[] chars = new char[table.length];
    for (int i = 0; i < table.length; i++)
    {
        chars[table[i]-1] = text.charAt(i);
    }

    return new String(chars);
}

答案 3 :(得分:1)

假设您的排列表没有改变,您可以这样做:

public static String   GetoriginalText(String TextafterPermutation,int [] table ){

   char[] chars=new char[table.length];

   for(int i=0;i<table.length;i++){
     chars[table[i] - 1] = TextafterPermutation.charAt(i);
   }

   return new String(chars);

}