使用Lambda在Java中合并两个不同类型的排序列表(String和Integer)

时间:2015-08-13 02:39:59

标签: java list lambda merge java-8

合并列表[“A”,“XYZ”,“AXTU”]和[2,4,6]

其中第一个列表按字长排序。如果第一个列表中的字符串长度与第二个列表中的数字相同,则首先出现的字符串应如下所示:

  

[“A”,2,“XYZ”,“AXTU”,4,6。

我试过这样:

Stream<String> stream = Stream.concat(list1.stream(), list2.stream().map(val -> Integer.toString(val)));
    System.out.println(stream.sorted().collect(Collectors.toList()));

,输出如下:

  

[2,4,6,A,AXTU,XYZ]

有什么想法解决这个问题吗?提前致谢。 :)

4 个答案:

答案 0 :(得分:4)

更简单的解决方案是使用Comparator.comparingInt

List<Object> result = Stream
    .concat(list1.stream(), list2.stream())
    .sorted(Comparator.comparingInt(
        obj -> obj instanceof String ? 2 * ((String) obj).length() : 1 + 2 * (Integer) obj))
    .collect(Collectors.toList());

答案 1 :(得分:3)

您的 private void releaseMediaRecorder(){ if (mMediaRecorder != null) { mMediaRecorder.reset(); // clear recorder configuration mMediaRecorder.release(); // release the recorder object mMediaRecorder = null; mCamera.lock(); // lock camera for later use // } } (s)混合类型(并且考虑到您的条件测试的长度为List),我认为您最容易使用可修改的{{1}并且你需要不断迭代第一个String。由于您的合并条件是长度(例如,Collection是一个字母,但是最后一个lexically),因此它排序后的事实无济于事。 ;

List

输出(按要求)

Z

答案 2 :(得分:1)

由于混合类型,这有点令人费解,但这里有一种方法可以完全用lambdas完成:

Stream<Object> stream = Stream.concat(list1.stream(), list2.stream());
System.out.println(stream.sorted((Object o1, Object o2) ->
    (o1 instanceof String ? 2*((String)o1).length() : 1+2*(Integer)o1)
    - (o2 instanceof String ? 2*((String)o2).length() : 1+2*(Integer)o2)
  ).collect(Collectors.toList()));

基本思想是定义一个lambda,它使用标准compareTo逻辑a - b将长度(如果它是一个字符串)与值(如果它是一个整数)进行比较。但是,为了处理平局的情况,我将所有值乘以2,然后在1值中添加额外的Integer。这会导致Integer在平局的情况下排在最后。

演示:http://ideone.com/39ppGD

答案 3 :(得分:0)

如果你想保持简单,只需使用基本的编码技术,就可以这样做

public class zipMergeAndOrderSort {

 public static void main(String[] args) {
    String[] array1 = new String[]{"A", "XYZ", "AXTU"};
    int[] array2 = new int[]{2, 4, 6};

    String[] newArray = new String[array1.length * 2];
    for (int i = 0; i < array1.length; i++){ //merges arrays over
        newArray[i * 2] = " " + array1[i];

        String spaces = ""; //creates the right number of spaces
        for (int j = 0; j < array2[i]; j++){
            spaces += " ";
        }

        newArray[(i*2)+1] = spaces + array2[i];; //adds spaces based on number
    }

    boolean running = true; //sorts
    while (running){
        running = false;
        for (int k = 0; k < newArray.length - 1; k++){
            if (newArray[k].length() > newArray[k+1].length()){
                running = true;
                String temp = newArray[k];
                newArray[k] = newArray[k+1];
                newArray[k+1] = temp;
                break;
            }
        }   
    }

    //removes spaces
    for (int l = 0; l < newArray.length; l++){
        newArray[l] = newArray[l].trim();
    }



    for (int i = 0; i < newArray.length; i++){
        System.out.print("[" + newArray[i] + "] ");
    }
 }

}

如果您希望字母始终位于数字(相同长度/数字)之前,您可以添加1个使用相同气泡排序技术的部分将数字(或字母)推向右侧