Как совместить два элемента в одном массиве? - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть двумерный массив, который содержит как таковой

         String[][] twodarray = { { "grey", "value1", "beta"  },
                                 { "r", "name", "gender" , "value", "Female"  },
                                { "r", "name", "gender", "value", "Male" },
                                { "r", "name", "exp", "value", "1" },
                                { "r", "name", "exp", "value", "2"  }, 
                                { "red", "value1", "alpha"  },
                                { "blue", "value2", "alpha"  }, 
                        };

Моя цель, когда есть 2 или более элементов [a] [0] и [a] [2] одинаковы, это будетсгруппировать и объединить элементы в один.

Например, [1] [0] и [2] [0], r и [1] [2] и [2] [2], полто же самое.

Таким образом, оно будет объединено в единое целое, как показано ниже.

{ "r", "name", "gender" , "value", "Female", "Male" },

Таким образом, мой желаемый результат будет следующим:

      final output:
          results = { { "grey", "value1", "beta"  },
                    { "r", "name", "gender" , "value", "Female", "Male" },
                    { "r", "name", "exp", "value", "1", "2"  }, 
                    { "red", "value1", "alpha"  },
                    { "blue", "value2", "alpha"  }, 
                  };

Что у меня есть, как следует

                for (int a=0; a < twodarray.length-1; a++)
                {
                    if ((twodarray[a][0] == twodarray[a+1][0]) && (twodarray[a][2] == twodarray[a+1][2]))
                }
    }

Мой вопрос: как я могу объединить массив как таковой?

Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Во-первых, я собрал строки в Map<List<String>, List<String>>, который группирует конечные значения (последнюю строку) по префиксу (каждая строка, кроме последней строки). Затем я собрал записи карты обратно в формат массива 2d String:

package samplejava;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class SampleJava {
public static void main(String[] args) {
    String[][] twodarray = { { "grey", "value1", "beta"  },
                                { "r", "name", "gender" , "value", "Female"  },
                                { "r", "name", "gender", "value", "Male" },
                                { "r", "name", "exp", "value", "1" },
                                { "r", "name", "exp", "value", "2"  }, 
                                { "red", "value1", "alpha"  },
                                { "blue", "value2", "alpha"  }, 
                        };
    Map<List<String>, List<String>> groups;
    groups = Arrays.stream(twodarray).collect(Collectors.groupingBy(
            (String[] item)-> Arrays.asList(item).subList(0, item.length - 1),
            Collectors.mapping(
                    (String[] item)-> item[item.length - 1],
                    Collectors.toList())));
    String[][] result = groups.entrySet().stream()
            .map(entry -> Stream.concat(entry.getKey().stream(),
                                        entry.getValue().stream())
                    .toArray(String[]::new))
            .toArray(String[][]::new);
    for(String[] row: result) {
        System.out.println(Arrays.toString(row));
    }
}
}

Однако этот метод не сохраняет первоначальный порядок элементов. Но вы не сказали, что это было необходимо.

0 голосов
/ 16 сентября 2018

У вас есть эта ошибка, потому что на последнем шаге цикла, когда a = 6, вы пытаетесь получить 7-й элемент массива (при twodarray[a+1][0]), которого, очевидно, не существует. Вы должны сделать цикл от 0 до a.length - 1, чтобы ваш индекс был связан. for (int a=0; a < twodarray.length - 1; a++)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...