Java 数组中的公共元素及其索引

Java 数组中的公共元素及其索引,java,Java,我有两个数组 array1 = {1,2,1,3,5,2} array2 = {a,b,c,d,e,f} 在数组中有一些常见的位置(0,1,3,5)放置在称为“1,2”的数组中,也有一些对应的值放置在数组中2表示1的值为“a”,依此类推 所以我需要检查array1中是否有公共值,检查它的位置并从同一位置的array2中获取值 **因为在阵列1中有两个元素(1,2)是公共的,其位置是(0,1,3,5) 输出为:a、b、d、f String test = "1$2$1$3$5$2"; St

我有两个数组

array1 = {1,2,1,3,5,2}
array2 = {a,b,c,d,e,f}
在数组中有一些常见的位置(0,1,3,5)放置在称为“1,2”的数组中,也有一些对应的值放置在数组中2表示1的值为“a”,依此类推

所以我需要检查array1中是否有公共值,检查它的位置并从同一位置的array2中获取值

**因为在阵列1中有两个元素(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(",");

        }
    }
String test=“1$2$1$3$5$2”;
字符串[]strArray=test.split(\\$);
StringBuilder ste=新的StringBuilder();
HashSet=newhashset();
String str2=“a$b$c$d$e$f”;
字符串[]strArray1=str2.split(\\$);
对于(int i=0;i

它没有显示正确的结果。有什么想法吗?

您希望输出包含
array2
中所有在
array1
中重复的元素。但是,您的算法将每个元素依次添加到一个集合中,然后测试失败(由于预先存在的项是
相等的
)。此
add
操作在添加第二个副本之前不会失败-它根本不会检测到第一个副本

下面是一个Java 8解决方案,它将检测所有重复项(并处理不同长度的数组):


如果您想要比@sprinter(即O(n^2))提出的更高效的流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
值,并将它们连接在一起。

您可以在实际代码中包括声明和分配数组的位置吗?您的数组变量名似乎与您给出的代码不匹配。很难理解,“它工作不好”-这意味着什么?数组1的索引3也是值“3”。你是说(0,1,2,5)
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(","));