java如何穿插
Java 中的穿插操作
在 Java 中,"穿插"通常指将两个或多个数据集合、字符串或数组按特定顺序交替合并。以下是几种常见的实现方法:
字符串穿插合并
使用 StringBuilder 交替追加字符:
String str1 = "ace";
String str2 = "bdf";
StringBuilder result = new StringBuilder();
int maxLength = Math.max(str1.length(), str2.length());
for (int i = 0; i < maxLength; i++) {
if (i < str1.length()) result.append(str1.charAt(i));
if (i < str2.length()) result.append(str2.charAt(i));
}
System.out.println(result.toString()); // 输出 "abcdef"
数组穿插合并
对于两个数组的交替合并:
int[] arr1 = {1, 3, 5};
int[] arr2 = {2, 4, 6, 8};
int[] merged = new int[arr1.length + arr2.length];
int index = 0;
for (int i = 0; i < Math.max(arr1.length, arr2.length); i++) {
if (i < arr1.length) merged[index++] = arr1[i];
if (i < arr2.length) merged[index++] = arr2[i];
}
// 结果: [1, 2, 3, 4, 5, 6, 8]
使用流(Stream)实现
Java 8+ 可以使用流式操作:
List<String> list1 = Arrays.asList("a", "c", "e");
List<String> list2 = Arrays.asList("b", "d", "f");
List<String> interleaved = IntStream.range(0, Math.max(list1.size(), list2.size()))
.boxed()
.flatMap(i -> {
List<String> pair = new ArrayList<>();
if (i < list1.size()) pair.add(list1.get(i));
if (i < list2.size()) pair.add(list2.get(i));
return pair.stream();
})
.collect(Collectors.toList());
// 结果: [a, b, c, d, e, f]
多线程交替执行
实现线程间的交替执行(同步控制):
class InterleaveThreads {
private static final Object lock = new Object();
private static volatile boolean turn = true;
public static void main(String[] args) {
new Thread(() -> print("A", true)).start();
new Thread(() -> print("B", false)).start();
}
static void print(String s, boolean myTurn) {
for (int i = 0; i < 5; i++) {
synchronized (lock) {
while (turn != myTurn) {
try { lock.wait(); }
catch (InterruptedException e) {}
}
System.out.print(s);
turn = !turn;
lock.notifyAll();
}
}
}
}
// 输出: ABABABABAB
集合穿插算法
通用集合穿插方法:

public static <T> List<T> interleave(List<T> list1, List<T> list2) {
List<T> result = new ArrayList<>();
Iterator<T> it1 = list1.iterator();
Iterator<T> it2 = list2.iterator();
while (it1.hasNext() || it2.hasNext()) {
if (it1.hasNext()) result.add(it1.next());
if (it2.hasNext()) result.add(it2.next());
}
return result;
}
这些方法可以根据具体需求选择,字符串和数组操作适合简单场景,流式处理更函数式,而多线程方案适用于并发控制场景。






