我有两个数组。我需要空白以备后用。
两个数组都将具有公共值,并且公共值应按顺序排列。
[这里有Alpha,Beta Phi和Gamma。两个数组之间都存在空格。
String[] a = { " ", "Alpha", "Beta", "Phi", " ", "Gamma" };
String[] b = { "Alpha", " ", "Beta", "Phi", "Gamma", " " };
输出应考虑第一个数组,即,由于数组a的第一个元素为“”,因此输出以Blank开头。第二个数组的Alpha和Beta之间的空白以及Gamma之后的空白应保持不变,因为它是第二个数组的一部分。另外,由于在第一个数组a中,在Phi和Gamma之间还有另一个“”,它不在第二个数组b中出现,因此也被添加到输出中。两个数组的顺序必须保持相同,因为插入“”会改变位置。
预期输出:
[ " ", "Alpha", " ", "Beta", "Phi", " ", "Gamma", " " ]
常规合并很简单,并且有很多示例。但是,这是我无法弄清楚的。
任何提示或示例都将有所帮助。
很抱歉,这实际上是重复的帖子。
请记住,这是边际情况,边际情况可能需要完全不同的算法。
package com.company.test;
import java.util.ArrayList;
import java.util.List;
public class TestArrayMerge {
static public List<String> merge(String[] a, String[] b) {
List<String> r = new ArrayList<>(a.length + b.length);
int i = 0, j = 0;
final String BLANK = " ";
while (i < a.length && j < b.length) {
if (a[i].equals(b[j])) {
r.add(a[i]);
i++;
j++;
} else if (a[i].equals(BLANK)) {
r.add(BLANK);
i++;
} else if (b[j].equals(BLANK)) {
r.add(BLANK);
j++;
} else {
// TODO: edge cases
r.add(b[j]);
j++;
}
}
for (; i < a.length; i++) {
r.add(a[i]);
}
for (; j < b.length; j++) {
r.add(b[j]);
}
return r;
}
public static void main(String[] args) {
System.out.println( merge(
new String[] { " ", "Alpha", "Beta", "Phi", " ", "Gamma" },
new String[] { "Alpha", " ", "Beta", "Phi", "Gamma", " " }
));
System.out.println( merge(
new String[] { " ", "Alpha", "Beta", "Phi", " ", "Gamma" },
new String[] { "Alpha", "NoSuch", "Beta", "Phi", "Gamma", " " }
));
}
}
输出:
[ , Alpha, , Beta, Phi, , Gamma, ]
[ , Alpha, NoSuch, Beta, Phi, , Gamma, ]