数组中的常见元素及其索引

时间:2015-09-04 04:31:57

标签: java

我有两个数组

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(",");

        }
    }

它没有显示正确的结果。任何想法?

2 个答案:

答案 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值并将它们连接在一起。