Java - 对具有极限最小值或最大值的数组进行排序

时间:2017-12-01 13:46:27

标签: java sorting

我想通过交替最大值和最小值来对我的float数组进行排序。 即最大,最小,次大,次小等。

例如,我在Arraylist中有以下值:

[1.22 ,2.55 ,9.88 ,7.23 ,8.22] 

我想把它排序为:

[9.88, 1.22 ,8.22 ,2.55 ,7.23]

目前我正在使用以下代码

对decessending顺序排序值
Collections.sort(characterPairs, new Comparator<Pair<String, Double>>() {

        @Override
        public int compare(Pair<String, Double> o1, Pair<String, Double> o2) {
            if(o1.second>o2.second)
                return -1;
            if(o1.second<o2.second)
                return 1;
            return 0;
        }
    });

2 个答案:

答案 0 :(得分:2)

我完成了以下代码,感谢大家的时间。

  Collections.sort(characterPairs, new Comparator<Pair<String, Double>>() {

        @Override
        public int compare(Pair<String, Double> o1, Pair<String, Double> o2) {
            double n1,n2;
            if(o1.second<0.50)  // 0.50 is the posible mean value
                n1=1-o1.second; // 1 is the maximum posible value
            else
                n1=o1.second;
            if(o2.second<0.50) // 0.50 is the posible mean value
                n2=1-o2.second; // 1 is the maximum posible value
            else
                n2=o2.second;

            if(n1>n2)
                return -1;
            if(n1<n2)
                return 1;
            return 0;
        }
    });

此处如果值很小,那么平均值(50%)我从最大可能值中减去它,然后按降序排序。 (减去的值仅用于对实际值进行排序。)

所以如果我在数组中有这些值

[0.11,0.34,0.99,0.85,0.21]

它将按

排序
[ 0.99 , 0.11 (0.89) , 0.85 , 0.21 (0.79) , 0.34 (0.66)]
  • (value)是用于对其进行排序的减去值。

答案 1 :(得分:1)

我认为这太复杂了,无法尝试使用简单的比较器来解决它。您需要两个步骤,首先是常规排序,第二步是特殊合并。

    // first step:
    Collections.sort(characterPairs, (o1, o2) -> {
        return Double.compare(o1.second, o2.second);
    });

    // second step:
    List<Pair<String, Double>> result = new ArrayList<>(characterPairs.size());
    while (!characterPairs.isEmpty()){
        result.add(characterPairs.remove(characterPairs.size() -1));
        if (!characterPairs.isEmpty()) {
            result.add(characterPairs.remove(0));
        }
    }
    characterPairs = result;