我有两个数组
array1 = {1,2,1,3,5,2}
array2 = {a,b,c,d,e,f}
在位置(0,1,3,5)中有一些常见的数组称为“1,2”,并且有一些相应的值放在array2中,意味着1的值是“a”等等。
所以我需要检查array1中是否有任何常见值,检查其位置并从array2获取相同位置的值
**由于array1中有两个共同的元素(1,2),它们的位置是(0,1,3,5)。
输出为:a,b,d,f
String test = "1$2$1$3$5$2";
String[] strArray = test.split("\\$");
StringBuilder ste = new StringBuilder();
HashSet<String> set = new HashSet<String>();
String str2 = "a$b$c$d$e$f";
String[] strArray1 = str2.split("\\$");
for(int i = 0; i < strArray.length ; i++)
{
if(set.add(strArray[i]) == false)
{
ste.append(strArray1[i]).append(",");
}
}
它没有显示正确的结果。任何想法?
答案 0 :(得分:0)
您希望输出包含array2
中与array1
重复的所有元素。但是您的算法依次将每个元素添加到一个集合中,然后测试失败(由于预先存在的项目为equal
)。在添加第二个副本之前,此add
操作不会失败 - 它根本不会检测到第一个副本。
这是一个Java 8解决方案,它将检测所有重复项(并处理不同长度的数组):
int[] array1 = {1, 2, 1, 3, 5, 2};
String[] array2 = {"a", "b", "c", "d", "e", "f"};
String duplicate = IntStream.range(0, Math.min(array1.length, array2.length))
.filter(n -> Arrays.stream(array1).filter(v -> v == array1[n]).count() > 1)
.mapToObj(n -> array2[n])
.collect(Collectors.joining(","));
答案 1 :(得分:0)
如果您想要比@sprinter(O(n ^ 2))提出的更高效的Stream API解决方案,您可以尝试这样做:
int[] array1 = {1, 2, 1, 3, 5, 2};
String[] array2 = {"a", "b", "c", "d", "e", "f"};
String result = IntStream.range(0, array1.length).boxed()
.collect(Collectors.groupingBy(i -> array1[i]))
.values().stream().filter(list -> list.size() > 1).flatMap(List::stream)
.map(idx -> array2[idx]).collect(Collectors.joining(","));
这里我们首先创建一个中间映射,其中键是来自array1
的元素,元素是相应索引的列表。然后我们从值创建另一个流,并仅采用具有多个索引的列表。然后我们展平所有这些列表,映射到相应的array2
值并将它们连接在一起。