合并列表[“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]
有什么想法解决这个问题吗?提前致谢。 :)
答案 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
在平局的情况下排在最后。
答案 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个使用相同气泡排序技术的部分将数字(或字母)推向右侧