Цикл For для замены двух элементов в массиве

#java #arrays

#java #массивы

Вопрос:

Допустим, у меня есть перетасованная колода карт в массиве

S, H, D, C — это масти, а 1,2,3 …. — ранги

К вашему сведению, T означает 10, так что ST означает лопату из 10.

 HK  C2  C8  CQ  S3  SJ  S4  D2  HQ  H9  HT  DT  ST  
H2  H3  SA  CA  HJ  S9  S6  S8  H8  H6  C7  D7  CJ  
H7  C9  DQ  DA  C5  D4  D6  D9  SK  DJ  CK  DK  SQ  
D5  HA  D3  S2  H4  S5  C3  D8  CT  S7  C6  C4  H5
 

и я хочу отсортировать его по масти и рангу так, чтобы он стал

 S2  S3  S4  S5  S6  S7  S8  S9  ST  SJ  SQ  SK  SA  
H2  H3  H4  H5  H6  H7  H8  H9  HT  HJ  HQ  HK  HA  
D2  D3  D4  D5  D6  D7  D8  D9  DT  DJ  DQ  DK  DA  
C2  C3  C4  C5  C6  C7  C8  C9  CT  CJ  CQ  CK  CA 
 

До сих пор я пытался использовать метод Array.sort, чтобы сначала изменить его на

 Arrays.sort(arr); 

C2  C3  C4  C5  C6  C7  C8  C9  CA  CJ  CK  CQ  CT  
D2  D3  D4  D5  D6  D7  D8  D9  DA  DJ  DK  DQ  DT  
H2  H3  H4  H5  H6  H7  H8  H9  HA  HJ  HK  HQ  HT  
S2  S3  S4  S5  S6  S7  S8  S9  SA  SJ  SK  SQ  ST 
 

Затем в моем методе swap я реализовал цикл for для замены 8-го и 12-го элементов массива. Мой вопрос заключается в том, что я вижу некоторую формулу, так что в каждой отдельной строке я должен поменять местами 8-й и 12-й элементы массива. Однако мой цикл for может менять местами только 1-ю строку, как показано ниже:

           int x = 8;
          int y = 12;
                
          for(int k = 0;  k < 13 ;k  )
          {
              String temp = arr[x];
              arr[x] = arr[y];
              arr[y] = temp;
          }
 

таким образом, я могу поменять местами свою первую строку на:

 C2  C3  C4  C5  C6  C7  C8  C9  CT  CJ  CK  CQ  CA  
 

Я думаю, что, поскольку каждая масть имеет 13 карт (например, масть C займет 0-12 индексов массива, масть D займет 13-25 индексов массива ..), Мне нужно составить целое число x = 8 и y = 12, а затем увеличивать их на 13 после каждого успешного обмена, чтобычто я также могу поменять местами другие строки. Однако я застрял и не могу найти способ.

итак, добавив еще один цикл for:

 
              for(int k = 0;  k < 13 ;k  )
              {
                  String temp = str[i 13];
                  str[i 13] = str[j 13];
                  str[j 13] = temp;
              }
 

я могу изменить вторую строку элемента на

 D2  D3  D4  D5  D6  D7  D8  D9  DT  DJ  DK  DQ  DA  
 

Есть ли более динамичный способ сделать это, например, вложенный цикл for ? Спасибо

Комментарии:

1. Arrays.sort это хорошо. Просто укажите пользовательский Comparator параметр для переопределения порядка по умолчанию, реализованного в String .

2. Помимо основной вещи с массивом: не представляйте карты в виде строк. Создайте два перечисления, одно для масти, одно для ранга, оба могут быть сопоставимы. Затем создайте класс карт с полем масти и ранга. Создавайте полезные абстракции. В противном случае вам придется повторять сложный код повсюду, потому что вы имеете дело с элементами, с которыми вам нужно иметь дело… настолько сложно. Потому что вам не хватает этих полезных абстракций.

3. Когда я слышу «Извините, мне не разрешено использовать comparator» , я вижу в своем воображении хирурга, который говорит: «Извините, у меня нет скальпеля. Я должен использовать швейцарский нож «. Не слушайте профессора, который запрещает вам делать все правильно.

4. Ах да.. вы правы. Я удалил циклы for и просто зациклил обмен 4 раза, и каждый раз, когда он зацикливался, я увеличивал свои целые числа x и y на 13. таким образом, я могу поменять местами все 4 строки моих карточек только с 1 циклом for, не используя цикл for для замены элементов. Большое вам спасибо за вашу помощь.

5. @JanB Small К вашему сведению: теперь вы поменяли T местами и A , но ваши Q и K также должны поменяться местами.