【问题标题】:does java lists.transform can change the list order?java lists.transform 可以更改列表顺序吗?
【发布时间】:2014-09-23 08:05:28
【问题描述】:

我有一个检查排序结果列表顺序的单元测试。

奇怪的是,测试总是通过intellij,但是当我从控制台运行时总是失败./gradlew

会不会是transform 或其他方法因环境而异?

public List<Image> sortImages(List<Image> inputImages, UserInfo userInfo) {
    if (inputImages == null) {
        return null;
    }
    List<ImageScore> imageScoreList = createImageScoreListFromImageList(inputImages);
    Collections.sort(imageScoreList, imageScoreDescComparator);
    imageScoreList = getSubListIfListIsTooLong(userInfo, imageScoreList);
    List<Image> sortedImages = transformImageScoreListToImageList(imageScoreList);
    return sortedImages;
}

private List<ImageScore> getSubListIfListIsTooLong(UserInfo userInfo, List<ImageScore> imageScoreList) {
    if (userInfo != null && userInfo.channel != null && userInfo.channel.equals(UserInfo.UserChannel.CLIENT)) {
        if (imageScoreList.size() > VenueConfig.s.MAX_IMAGES_TO_RETURN_TO_CLIENT) {
            imageScoreList = imageScoreList.subList(0, VenueConfig.s.MAX_IMAGES_TO_RETURN_TO_CLIENT);
        }
    }
    return imageScoreList;
}

private List<Image> transformImageScoreListToImageList(List<ImageScore> imageScoreList) {
    Collection result = Collections2.transform(imageScoreList, new Function<ImageScore, Image>() {
        @Override
        public Image apply(ImageScore input) {
            return input.image;
        }
    });

    return new ArrayList(result);
}

private List<ImageScore> createImageScoreListFromImageList(List<Image> inputImages) {
    Collection result = Collections2.transform(inputImages, new Function<Image, ImageScore>() {
        @Override
        public ImageScore apply(Image input) {
            ImageScore imageScore = new ImageScore(input);
            imageScore.score = imageScoreCalculator.getScoreForImage(input);
            return imageScore;
        }
    });
    return new ArrayList(result);
}

更新:

我做如下逻辑:

1) 将Image 转换为ImageScore(带有元素{int score, Image image}) 这也设置了分数

2) 然后我按照分数排序

3) 然后我将ImageScore 重新转换为Image

我怎样才能做到这一点?作为计算分数的排序中继?

【问题讨论】:

  • 在你的测试断言中处理这个可能是最容易的。

标签: java list intellij-idea transform


【解决方案1】:

是的,很可能就是这样。

transform 返回一个Collection(根据定义,它没有排序),并且在其文档中不提供关于排序的保证。

它似乎总是排序的,但这是依赖于实现的,你不应该依赖任何东西。

如果你的元素有逻辑顺序,你可以试试这个:

Collections.sort(result);
return new ArrayList(result);

否则,您可以使用某种辅助函数来测试两个列表的等价性,而无需注意排序。

【讨论】:

  • 这对我来说有问题,我执行以下逻辑:1)将Image转换为ImageScore(带有元素{int score, Image image}),这也设置了分数2)然后我根据分数进行排序3) 然后我将ImageScore 重新转换为Image 我该如何以不同的方式执行此操作?作为计算分数的排序中继?
  • 你可以尝试在你的测试断言中使用一个实用方法来测试列表是否包含相同的元素,而不考虑 odering,比如CollectionUtils.isEqualCollection(...) - 链接:stackoverflow.com/questions/1565214/…
  • 但我想检查订单。 Lists.transform 会保留顺序吗?
  • 好的,好吧 - 不,就是这样,Collections2.transform保证保持秩序。为什么不直接创建一个新的ArrayListImage,然后自己填充它,而不是使用Collections2.transform
猜你喜欢
  • 1970-01-01
  • 2012-04-18
  • 2010-10-29
  • 2020-03-21
  • 2017-01-06
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 2022-07-11
相关资源
最近更新 更多