问题如右:有两个字符串数组a和b,寻找相同元素 (a和b都比较大)

[color=blue][color=cyan][/color][b]Java代码
package com.test.javaeye;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
* 题目:有两个字符串数组a和b,寻找相同元素
*
*/
public class Test1 {

public static void main(String[] args) {

String[] strArr1 = {"xiaoxin","niutou","shanqiu","luobo" };
String[] strArr2 = {"xiaoxin","ggg","shanqiu","meile","dddsf","niutou"};

List<String> list = getAllSameElement2(strArr1,strArr2);
if(list == null) {
System.out.println("没有相同的元素");
System.exit(0);
}
for(String s:list) {
System.out.println(s);
}
}

/**
* 比较简洁的方法,但明显不是面试官想要的答案,因为题目后面标注了'两个数组都<br>
* 很大的说明'.
*
* @param strArr1
* @param strArr2
* @return
*/
public static List<String> getAllSameElement1(String[] strArr1,String[] strArr2) {
if(strArr1 == null || strArr2 == null) {
return null;
}
List<String> strList1 = new ArrayList<String>(Arrays.asList(strArr1)); //----------代码段1
List<String> strList2 = new ArrayList<String>(Arrays.asList(strArr2)); //--------------代码段2

strList1.retainAll(strList2);
return strList1;
}

/**
* 由于最近看见一文章,是描述数据库mergeJoin 的扫描方式的,仿照里面的大致逻辑自己写了<br>
* 个类似的方法。如果数组大的话,这个要比getAllSameElement1好
*
* 大致思路是:1.首先将两个数组A、B排序(递增)<br>
* 2.分别从A和B中各取出一元素a,b,对a和b进行比较:<br>
* 1)如果a与b相等,则将a或b存入一指定集合中<br>
* 2)如果a小于b,则继续取A的下一元素,再与b比较<br>
* 3)如果a大于b,则取B的下一个元素,与a进行比较<br>
* 3.反复进行步骤2,知道A或B的元素都比较完<br>
* 4.返回集合(存了相同的元素)<br>
* @param strArr1
* @param strArr2
* @return
*/
public static List<String> getAllSameElement2(String[] strArr1,String[] strArr2) {
if(strArr1 == null || strArr2 == null) {
return null;
}
Arrays.sort(strArr1);
Arrays.sort(strArr2);

List<String> list = new ArrayList<String>();

int k = 0;
int j = 0;
while(k<strArr1.length && j<strArr2.length) {
if(strArr1[k].compareTo(strArr2[j])==0) {
if(strArr1[k].equals(strArr2[j]) ) {
list.add(strArr1[k]);
k++;
j++;
}
continue;
} else if(strArr1[k].compareTo(strArr2[j])<0){
k++;
} else {
j++;
}
}
return list;
}
}

package com.test.javaeye;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
* 题目:有两个字符串数组a和b,寻找相同元素
*
*/
public class Test1 {

public static void main(String[] args) {

String[] strArr1 = {"xiaoxin","niutou","shanqiu","luobo" };
String[] strArr2 = {"xiaoxin","ggg","shanqiu","meile","dddsf","niutou"};

List<String> list = getAllSameElement2(strArr1,strArr2);
if(list == null) {
System.out.println("没有相同的元素");
System.exit(0);
}
for(String s:list) {
System.out.println(s);
}
}

/**
* 比较简洁的方法,但明显不是面试官想要的答案,因为题目后面标注了'两个数组都<br>
* 很大的说明'.
*
* @param strArr1
* @param strArr2
* @return
*/
public static List<String> getAllSameElement1(String[] strArr1,String[] strArr2) {
if(strArr1 == null || strArr2 == null) {
return null;
}
List<String> strList1 = new ArrayList<String>(Arrays.asList(strArr1)); //----------代码段1
List<String> strList2 = new ArrayList<String>(Arrays.asList(strArr2)); //--------------代码段2

strList1.retainAll(strList2);
return strList1;
}

/**
* 由于最近看见一文章,是描述数据库mergeJoin 的扫描方式的,仿照里面的大致逻辑自己写了<br>
* 个类似的方法。如果数组大的话,这个要比getAllSameElement1好
*
* 大致思路是:1.首先将两个数组A、B排序(递增)<br>
* 2.分别从A和B中各取出一元素a,b,对a和b进行比较:<br>
* 1)如果a与b相等,则将a或b存入一指定集合中<br>
* 2)如果a小于b,则继续取A的下一元素,再与b比较<br>
* 3)如果a大于b,则取B的下一个元素,与a进行比较<br>
* 3.反复进行步骤2,知道A或B的元素都比较完<br>
* 4.返回集合(存了相同的元素)<br>
* @param strArr1
* @param strArr2
* @return
*/
public static List<String> getAllSameElement2(String[] strArr1,String[] strArr2) {
if(strArr1 == null || strArr2 == null) {
return null;
}
Arrays.sort(strArr1);
Arrays.sort(strArr2);

List<String> list = new ArrayList<String>();

int k = 0;
int j = 0;
while(k<strArr1.length && j<strArr2.length) {
if(strArr1[k].compareTo(strArr2[j])==0) {
if(strArr1[k].equals(strArr2[j]) ) {
list.add(strArr1[k]);
k++;
j++;
}
continue;
} else if(strArr1[k].compareTo(strArr2[j])<0){
k++;
} else {
j++;
}
}
return list;
}
}


说明: 1. 知道代码段1和代码段2为什么要 写成 List<String> strList1 = new ArrayList<String>(Arrays.asList(strArr1)); ,而不是List<String> strList1 = Arrays.asList(strArr1); 吗?你可以测试下,可能会让你产生一种继续探索Arrays类的欲望。
2.如果你有好的方法,请务必和大家共享啊,共同学习共同进步

因为:Arrays.asList 返回的是只读的List对象

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

网友想出来的其他方法:

public static void main(String[] args) {
// String[] strArr1 = { "xiaoxin", "niutou", "shanqiu", "luobo" };
// String[] strArr2 = { "xiaoxin", "ggg", "shanqiu", "meile", "dddsf", "niutou" };
String[] strArr1 = { "xiaoxin", "niutou", "shanqiu" };
String[] strArr2 = { "ggg", "shanqiu", "meile", "dddsf", "niutou", "luobo" };
int max = strArr1.length > strArr2.length ? strArr1.length : strArr2.length;
int[][] ary = new int[max * 4][];
for (int i = 0; i < strArr1.length; i++) {
int hash = hash(strArr1[i].hashCode());
int index = indexFor(hash, max * 4);
if (ary[index] == null) {
ary[index] = new int[1];
} else {
ary[index] = Arrays.copyOf(ary[index], ary[index].length * 2);
}
for (int j = 0; j < ary[index].length; j++) {
if (ary[index][j] == 0) {
ary[index][j] = hash;
}
}
}
for (int i = 0; i < strArr2.length; i++) {
int hash = hash(strArr2[i].hashCode());
int index = indexFor(hash, max * 4);
if (ary[index] != null) {
for (int j = 0; j < ary[index].length; j++) {
if (ary[index][j] == hash) {
System.out.println(strArr2[i]);
}
}
}
}
}

static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}

static int indexFor(int h, int length) {
return h & (length - 1);
}
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

public static Set<String> getAllSameElement3(String[] strArr1,
String[] strArr2) {
if (strArr1 == null || strArr2 == null) {
return null;
}
List<String> list1 = new ArrayList<String>(Arrays.asList(strArr1));
Set<String> set1 = new HashSet<String>(list1);
set1.retainAll(Arrays.asList(strArr2)); return set1;
}

//retainAll方法 HashSet中最高效


[color=olive][/color] [color=cyan][/color][b][/b][/b][/color]
<think>好的,我现在需要帮用户解决在MATLAB中查找数组a数组b对应位置元素的索引的问题。首先,我得确认用户的具体需求。用户提到的是两个数组ab,要找到a中元素于b对应位置元素的索引。这里的“对应位置”很重要,意味着两个数组的维度必须相同,否则无法逐个元素比较。 首先,我应该考虑如何比较两个数组的对应元素。在MATLAB中,逐个元素比较通常使用点运算符,比如a > b会生成一个逻辑数组,其中每个元素是ab对应位置的比较结果。然后,使用find函数将这个逻辑数组转换为线性索引或者行列下标。这应该是最直接的方法。 接下来,我需要验证这个方法的正确性。例如,假设ab都是一维数组,如a = [3, 5, 2],b = [4, 3, 1],那么a > b的结果应该是[0, 1, 1],对应的索引就是23的位置。使用find(a > b)应该返回[2,3],这预期一致。如果是多维数组,比如矩阵,find的结果可能返回线性索引,用户如果需要行列下标的话,可能需要用ind2sub函数转换,或者直接使用[row, col] = find(a > b)来获取行列位置。 然后,我需要考虑用户可能遇到的潜在问题。例如,数组ab的维度是否一致。如果维度不一致,MATLAB会报错,所以在比较之前需要确保size(a)等于size(b)。用户可能没有注意到这一点,所以应该在回答中提到这一点,提醒用户检查数组的维度。 另外,用户可能需要处理不同数据类型的数组,比如数值数组、逻辑数组或者cell数组,但根据问题描述,用户应该是在处理数值数组,所以这种情况可能不需要特别处理。但如果有非数值数据,比较操作会错,不过用户的问题中没有提到,所以暂时不考虑。 参考用户提供的引用,特别是引用[2]提到了intersect函数用于找相同元素的位置,但这里用户需要的是对应位置比较,而不是找共同元素,所以直接比较即可。引用[3]提到了数组运算中的问题,比如除以零的情况,但这里的问题不涉及运算,只是比较,所以应该不会有类似的问题。引用[4]中的strfind用于字符串查找,但用户的问题是关于数值数组的,所以可能不需要用到字符串处理函数。 接下来,生成示例代码。比如: a = [3, 5, 2]; b = [4, 3, 1]; indices = find(a > b); 这样会得到indices为23。对于矩阵的情况: A = [1, 3; 4, 2]; B = [0, 5; 3, 1]; [row, col] = find(A > B); 这会返回符合条件的行列索引。 还需要考虑用户是否需要逻辑数组而不是索引,比如直接使用逻辑数组进行索引操作,如a(a > b),但这可能不是用户的需求,用户明确要求的是索引位置,所以应该用find函数。 最后,总结步骤:确保维度一致,使用a > b生成逻辑数组,用find获取索引。提醒用户注意维度问题,并提供示例代码。可能还需要提到如何处理多维数组的情况,是否需要线性索引或行列下标。 相关问题部分,可以考虑性能优化(比如数组处理的效率)、如何处理不同维度的数组(如果用户确实遇到维度问题)、或者如何同时获取值索引等问题。这些都可能扩展用户的知识,帮助他们更深入地理解MATLAB的数组操作。</think>在MATLAB中查找数组$a$数组$b$对应位置元素的索引,可以通过**逐元素比较+逻辑索引**实现,具体步骤如下: --- ### 1. 核心方法 ```matlab % 输入两个同维度数组ab indices = find(a > b); ``` - **关键点**:运算符`>`会生成逻辑数组,`find()`函数将逻辑值转换为线性索引 - **维度要求**:$a$$b$必须维度相同,否则会报错`Matrix dimensions must agree` - **输特性**:返回满足$a(i) > b(i)$的**线性索引**(适用于任意维度数组) --- ### 2. 完整示例 #### 一维数组场景 ```matlab a = [3, 5, 2, 9]; b = [4, 3, 1, 7]; indices = find(a > b) % 输:[2, 4] ``` #### 二维矩阵场景 ```matlab A = [1, 3; 4, 2]; B = [0, 5; 3, 1]; [row, col] = find(A > B) % 输:row=[1;2], col=[1;2] ``` --- ### 3. 扩展应用 #### 直接获取满足条件的元素值 ```matlab selected_values = a(a > b); ``` #### 处理多维数组 ```matlab % 将线性索引转换为下标(适用于三维及以上数组) [sub1, sub2, sub3] = ind2sub(size(a), indices); ``` --- ### 4. 注意事项 - **维度验证**:先检查`isequal(size(a), size(b))` - **逻辑运算效率**:MATLAB的逐元素比较已高度优化,适用于规模数据[^3] - **替代方案**:逻辑索引`a > b`可直接用于赋值/筛选操作[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值