Как выполнить итерацию списка строк декартовым способом?

#java

#java

Вопрос:

У меня есть строка, которая была разделена на 5 символов для каждого элемента:

ss=»A4A12B2B16A1B01A1B23S1B32A1A32B1B44B2A44A4C16A3D15A4D01A5D23A4E20B1F24A2F17A1F01B0G16A5C34A4C43A5C53A3D50A4D61S4E50A0F51A1F67S2E46B1E31A1F30A2G36A1G41B1G52″;

 List<String> parts = new ArrayList<>();
int len = ss.length();
int partitionSize=5;
for (int i = 0; i < len; i  = partitionSize) {
            parts.add(ss.substring(i, Math.min(len, i   partitionSize)));
        }
System.out.println(parts)
  

Затем код распечатает что-то вроде этого:

[A4A12, B2B16, A1B01, A1B23, S1B32, A1A32, B1B44, B2A44, A4C16, A3D15, A4D01, A5D23, A4E20, B1F24, A2F17, A1F01, B0G16, A5C34, A4C43, A5C53, A3D50, A4D61 , S4E50, A0F51, A1F67, S2E46, B1E31, A1F30, A2G36, A1G41, B1G52]

У меня есть функция foo, которая принимает только две строки ввода. Для каждого i массив будет увеличиваться с [A4A12, B2B16] до [A4A12, B2B16, A1B01] до [A4A12, B2B16, A1B01, A1B23] и так далее, пока список не будет исчерпан…

Когда i ==0, я хочу, чтобы функция вычисляла foo(A4A12,B2B16)

Когда i ==1, я хочу, чтобы функция вычисляла foo(A4A12,B2B16), затем foo(B2B16,A1B01)

Когда i == 3, я хочу, чтобы функция вычисляла foo (A4A12,B2B16), затем foo(A4A12,A1B01), затем foo (A4A12,A1B23), затем foo (B2B16, A1B01), затем foo (B2B16,A1B23), затем foo(A1B01,A1B23). Затем foo(A1B01,A1B23).

Это то, что я пробовал до сих пор

 List<List> parts1 = new ArrayList<>();
for (int i=0;i<set.size();i  ){
         parts1.add(parts.subList(0,i 1));//increase the size of the array for every iteration
         for (int j=0;j<parts1.size();i  ){//how to loop this in a Cartesian way??
                        if(foo(parts.get(j), parts.get(j 1))){
                              return true;}
  

Конечно, цикл не будет выполняться исчерпывающим / декартовым способом, не так ли? Есть ли способ сделать это?

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

1. Вы хотите оценить функцию foo для всех первых (i 1) парных комбинаций?

Ответ №1:

Если вы хотите выполнить итерацию декартовым способом, вы могли бы сделать следующее:

 String ss = "A4A12B2B16A1B01A1B23";
List<String> parts = new ArrayList<>();
int len = ss.length();
int partitionSize=5;
for (int i=0; i<len; i =partitionSize)
    parts.add(ss.substring(i, Math.min(len, i   partitionSize)));

for (int i=1; i<parts.size(); i  ) {
    List<String> pairs = new LinkedList<>();
    for (int j=0;j<=i;j  )
        pairs.add(parts.get(j));
    while(!pairs.isEmpty()) {
        String cur1 = pairs.get(0);
        Iterator<String> it2 = pairs.iterator();
        it2.next(); //discard first element which of course exists
        while(it2.hasNext()) {
            String cur2 = it2.next();
            if(foo(cur1, cur2)) {
                    //...
            }
        }
        pairs.remove(0);
    }
    //end processing of the i-th cartesian product
}
  

Обратите внимание, что если вы хотите, чтобы для i-го декартова произведения все пары возвращали значение true для вызова foo, тогда вы должны использовать логическую переменную, инициализированную значением true, и, если это правда, что существует пара, такая, что для этой пары функция foo возвращает false, тогда вы устанавливаете этой логической переменной значение false . В конце обработки i-го декартова произведения вы можете проверить эту логическую переменную.