3

I have a 2D array that contains as such

         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"  }, 
                        };

My goal is when there are 2 or more elements [a][0] and [a][2] are the same, it will group together and combine the elements as one.

For example, [1][0] and [2][0], r and [1][2] and [2][2], gender are the same.

Thus, it will combine into one as shown below.

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

Thus, my desired output is as follow

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

What I have is as follow

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

My question is how can I combine the array as such?

Any help will be much appreciated.

4

2 回答 2

0

首先,我将行收集到一个Map<List<String>, List<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));
    }
}
}

但是,此方法不保留项目的原始顺序。但你没有说这是必要的。

于 2018-09-16T14:17:44.457 回答
0

您有此错误,因为在循环的最后一步,当 a = 6 时,您尝试获取数组的第 7 个元素(何时twodarray[a+1][0]),显然不存在。您应该从 0 循环到 a.length - 1,以使您的索引绑定。 for (int a=0; a < twodarray.length - 1; a++)

于 2018-09-16T12:29:07.553 回答