java - 有没有办法移动二维数组矩阵中的列?

标签 java arrays sorting matrix multidimensional-array

我想采用下面的矩阵,并将字符 TOAD 重新排列为 ADOT,并将下面相应的列重新排列到上面的字符移动的位置,例如 A 移动到第 0 列,所以现在 VGD 应该全部位于第 0 列等.

顺便说一句,TOAD 是一个单独的数组!我使用该关键字按字母顺序对矩阵进行排序。

    T O A D 
    V V V X 
    D V G G 
    D F D V 

我已经讲到这里了,基本上我想知道的是,如果 A 移动到开头,我如何使下面的整列随之移动?

public class CipherKey {

Scanner write = new Scanner (System.in);
Matrix polyCipher;
private final char[] PHRASE_KEY = { 'J', 'A', 'V', 'A'};
String[][] matrixStore = new String[PHRASE_KEY.length][PHRASE_KEY.length];
String outmrk = "|";
String inmrk = ",";
CipherKey(Matrix m) {
    polyCipher = m;
}


public void assembleMatrix()  { 

    String s = matrixFormatter(polyCipher.getTranslation());
    matrixStore = buildMatrix(s,outmrk,inmrk);
    System.out.print(printMatrix(matrixStore));
    System.out.print(sortMatrix(matrixStore));


}


public String printMatrix(String s [][]){
    char key[] = polyCipher.getKeyword().toCharArray();
    String keyOut = "";
    for(int i=0;i<key.length;i++){
        keyOut += key[i] + " ";
    }
    keyOut += "\n";
    for (int i = 0; i < s.length; i++) {
   //     keyOut += PHRASE_KEY[i] + " ";
       for (int j = 0; j < s[i].length; j++) {
            keyOut += s[i][j] + " ";
        }
        keyOut += "\n";
    }
    return keyOut.toUpperCase();
}

public static String [][] buildMatrix (String translation, String outermarker, String innermarker) {
    // outerdelim may be a group of characters
    String [] sOuter = translation.split("[" + outermarker + "]"); 
    int size = sOuter.length;
    // one dimension of the array has to be known on declaration:
    String [][] result = new String [size][size]; 
    int count = 0;
    for (String line : sOuter)
    {
        result [count] = line.split (innermarker);
        ++count;
    }
    return result;
}

这是我遇到问题的部分:

public String sortMatrix(String a [][]){

    System.out.println("\nAlphabetically rearranged: ");
    char[] key = polyCipher.getKeyword().toCharArray();
    char[] alphaKey = polyCipher.getKeyword().toCharArray();
    String alphaOut = "";
    for(int i=0;i<alphaKey.length;i++){
        alphaOut += alphaKey[i] + " ";
    }

        char[][] x = new char[4][36];
        x[0] = new char[]{key[0], key[1], key[2], key[3]};
        x[1] = new char[]{'V', 'V', 'V', 'X'};
        x[2] = new char[]{'D', 'V', 'G', 'G'};
        x[3] = new char[]{'D', 'F', 'D', 'V'};

        String [] strArray = new String[x[0].length];

        for (int loop1 = 0; loop1 < x.length; loop1++){
            for (int loop2 = 0; loop2 < x[0].length; loop2++){
                if(strArray[loop2] == null){
                    strArray[loop2] = "";
                }
                strArray[loop2] += x[loop1][loop2];
            }
        }

        Arrays.sort(strArray);

        alphaOut += "\n";
        for (int i = 0; i < strArray.length; i++) {
       //     keyOut += PHRASE_KEY[i] + " ";
           for (int j = 0; j < s[i].length; j++) {
               alphaOut += s[i][j] + " ";
            }
           alphaOut += "\n";
        }
        alphaOut.toUpperCase();


}


public String matrixFormatter(String x){

     String resultstr = "";
      int i = 0;
      while(i < x.length()) {
        // If end of string: only add character.
        if (i == x.length() - 1) {
          resultstr += x.substring(i, i + 1);
        } else {
          if ( ((i + 1) % 4) == 0) {
            resultstr += x.substring(i, i + 1)  + "|";
          } else {
            resultstr += x.substring(i, i + 1)  + ",";
          }
        }
        i++;
      }
      return resultstr;

}

}

最佳答案

为此,您必须跟踪移动并相应地移动其他元素。但是看看你的程序,我可以看到你依赖java API进行排序。

如果你想继续这样做,我可以给你一个对你有用的小技巧。

第 1 步:定义数组:

    char[][] x = new char[4][4];
    x[0] = new char[]{'T', 'O', 'A', 'D'};
    x[1] = new char[]{'V', 'V', 'V', 'X'};
    x[2] = new char[]{'D', 'V', 'G', 'G'};
    x[3] = new char[]{'D', 'F', 'D', 'V'};

第2步:将其转换为垂直连接字符的一维字符串数组。

    String [] strArray = new String[x[0].length];

    for (int loop1 = 0; loop1 < x.length; loop1++){
        for (int loop2 = 0; loop2 < x[0].length; loop2++){
            if(strArray[loop2] == null){
                strArray[loop2] = "";
            }
            strArray[loop2] += x[loop1][loop2];
        }
    }

第 3 步:对字符串数组进行排序

    Arrays.sort(strArray);

第4步:将其转换回char数组

    for (int loop1 = 0; loop1 < strArray.length; loop1++){
        for (int loop2 = 0; loop2 < strArray[loop1].length(); loop2++){
            x[loop2][loop1] = strArray[loop1].charAt(loop2);
        }
    }

这应该可以解决问题。

编辑: 假设您必须根据 char[] alpha 的位置切换 String a [][] 的位置,则必须将其转换为 char[][] 数组,如下所示:

    char[] alpha = {'T', 'O', 'A', 'D'};
    String a [][] = {{"V", "V", "V", "X"},{"D", "V", "G", "G"},{"D", "F", "D", "V"}};

    char[][] x = new char[a.length+1][];
    x[0] = alpha;

    for(int loop1 = 0; loop1 < a.length; loop1++){
        x[loop1+1] = new char[a[loop1].length];
        for (int loop2 = 0; loop2 < a[loop1].length; loop2++){
            x[loop1+1][loop2] = a[loop1][loop2].charAt(0);
        }
    }

这会将您的两个数组转换为一个二维数组,您可以在该数组上运行其余步骤:

char[][] x = new char[4][4];
x[0] = new char[]{'T', 'O', 'A', 'D'};
x[1] = new char[]{'V', 'V', 'V', 'X'};
x[2] = new char[]{'D', 'V', 'G', 'G'};
x[3] = new char[]{'D', 'F', 'D', 'V'};

关于java - 有没有办法移动二维数组矩阵中的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29519180/

相关文章:

c# - 从 ListView 排序中排除项目

c++ - 如何根据值的比率在C++中对 vector 进行排序

JAVA - 检查值是否不在其他索引二维数组中

java - 如何将 ArrayList 数据映射到 DTO

iphone - 将 NSDictionary 的 NSArray 保存到文件

python - 逐位形成字节并连接字节

java - 找到给定时间范围内所有可能的时间组合

java - 有效的 Java : Builder Pattern

java - java中形式参数的同步

c++ - 为什么我的数据流在 20 或 30 行后开始重复?