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