过滤列表<object []>以保留一致的值

时间:2015-08-03 12:14:52

标签: java arrays java-8 java-stream

首先,我有一个包含几个Object类型数组的列表,例如:

    Object[] arr1 = new Object[] {"FIM4R1500030", BigInteger.valueOf(5272456l), "A10328E00074531842"};
    Object[] arr2 = new Object[] {"FIM4R1500031", BigInteger.valueOf(886445384123l), "A10328E00074531842"};
    final List<Object[]> arrs = Arrays.asList(arr1, arr2);

然后,我编写了一个逻辑,过滤它们以保留一致的值,并为不一致的填充null。结果看起来像这样:

List[
  Object[][null,null,"A10328E00074531842"],
  Object[][null,null,"A10328E00074531842"]
]

现在,我的问题是,这个逻辑变得相当复杂和难以阅读,我不确定我是否能忍受它。另外,我真的不想开始编写一个完整的实用程序类,因为功能似乎很小。这是我的代码:

    final Predicate<Integer> isConsistant = index -> {

        for (Object[] arr : arrs) {
            if (!arr[index].equals(arrs.get(0)[index])) {
                return false;
            }
        }
        return true;
    };

    List<Object[]> filtered = arrs.stream().map(arr -> {

        Object[] returnList = new Object[arrs.get(0).length];

        for (int i = 0; i < arrs.get(0).length; i++) {
            if (isConsistant.test(i)) {
                returnList[i] = arrs.get(0)[i];
            } else {
                returnList[i] = null;
            }
        }

        return returnList;
    })
            .collect(toList());

我的问题是,如何使这更简单!

2 个答案:

答案 0 :(得分:1)

此代码的问题并不是它过于复杂,而是因为它不必要地慢:对于(row, column) arrs column的每一对,你再次走完整个阵列,试图确定isConsistant中的所有值是否彼此相等。实质上,您在同一列N上运行N - 每行一次,即使谓词始终返回相同的值。当行数很高时,这可能非常重要。

此过程始终以N个相同的行结束,因此您也可以构造该行一次,然后制作Object[] row = new Object[arrs.get(0).length]; for (int i = 0 ; i != arrs.get(0).length ; i++) { if (isConsistant.test(i)) { row[i] = arrs.get(0)[i]; } } // Now we make N copies of that row: List<Object[]> filtered = new ArrayList<Object[]>(); for (int i = 0 ; i != arrs.length() ; i++) { filtered.add((Object[])row.clone()); } 个副本:

filtered

如果您不打算修改clone的元素,则可以跳过N部分,并插入相同的对象app.factory('Point', function () { var data = { point: 0 }; return { getPoint: function () { return data.point; }, setPoint: function (point) { data.point = point; } }; }); 次。

答案 1 :(得分:1)

为什么您希望过滤器的结果为List<Object[]>?如果我很好地理解了您的问题,那么该列表中的所有Object[]看起来都是一样的。所以代码可能就是:

Object[] filtered = IntStream.range(0, arrs.get(0).length)
            .mapToObj(i -> arrs.stream().allMatch(arr -> arr[i] != null && arr[i].equals(arrs.get(0)[i])) ? arrs.get(0)[i] : null)
            .toArray();