比较两个字符串数组的内容,并删除出现在两个字符串中的字符串

问题描述:

这是一个项目程序,我一直无法解决这个问题,并希望有人能指出我的代码的问题,我我错过了。此代码的目标是比较两组数组(A和B)并创建第三个数组,其中只包含仅出现在B中的条目。我的方法是初始化第三个数组并将其填入每个条目与“”。从那里对两个给定的数组进行比较,如果B中的条目不在A中出现,则将该条目添加到第三个数组中。但是,当我测试我写的内容时,数组B完全按照原样复制到第三个数组中,没有条目被删除。 这是我的代码。 从我的弱小的人脑中查看代码,我觉得这应该工作,但事实并非如此。 如果字符串A包含“计算机” 和字符串B包含“计算机”,“是”,“你” 字符串C应该是“是”,“你” 仍然运行此代码,字符串C出来是“计算机” ”, “是”, “你”比较两个字符串数组的内容,并删除出现在两个字符串中的字符串

public static String [] findPatternInSentence(String [] A, String [] B) { 
     if (A== null){ 
      return null; 
     } 
     String[] C= new String[A.length+1]; 
      for (int p = 0; p < A.length+1; p++){ 
      C[p]= ""; 
        } 

       for(int i = 0; i< B.length; i++){ 
       int k = Eliza.inList(A[0], B); 
        if(k > -1){ 
        int j = 0; 
       if(A[j].equals(B[i]) && j < A.length-1){ 
         j++; 
       } 
       else { 

        C[j] = C[j] + " " + B[i]; 
       } 
      } 
      if (k == -1) 
      { 
       return null; 
      } 
     } 
     return C; 
    } 
+0

你检查我的答案吗?如果它没有帮助,我会去除它 – mmuzahid

例如,假设你的数组包含

String[] arr1 = {"a","b","c"}; 
String[] arr2 = {"a","b","c","d"}; 

利用套..

// add everything from arr2 
Set set = new TreeSet(Arrays.asList(arr2)); // ["a","b","c","d"] 

// remove everything that showed up in arr1 
set.removeAll(Arrays.asList(arr1)); // ["d"] 

如果您不能使用套,并希望基于阵列的方法(利用地图),关心的频率,而不是仅仅如果一个元素出现,你有没有在您的文章中提到..

String[] arr1 = {"a", "b", "c", "a", "a", "b", "c", "a"}; 
String[] arr2 = {"a", "b", "c", "d", "a", "b", "c", "d", "a", "b", "c", "d"}; 

int totalElems = 0; 

Map<String, Integer> freq = new HashMap<String, Integer>(); 

// add stuff from arr2 
for(String _b: arr2) { 
    totalElems++; 
    if(!freq.containsKey(_b)) 
     freq.put(_b, 0); 
    freq.put(_b, freq.get(_b)+1); 
} 

// add stuff from arr1, removing stuff that were in arr2 
for(String _a: arr1) { 
    if(freq.containsKey(_a) && freq.get(_a) > 0) { 
     totalElems--; 
     freq.put(_a, freq.get(_a)-1); 
    } 
} 

String[] c = new String[totalElems]; 
int ptr = 0; 
for(String key: freq.keySet()) { 
    int count = freq.get(key); 
    while(count != 0) { 
     c[ptr++] = key; 
     count--; 
    } 
} 
System.out.println(Arrays.toString(c)); // [b, c, d, d, d] 

如果你只是在乎A中没有出现的元素B. ..

String[] arr1 = {"a", "b", "c", "a", "a", "b", "c", "a"}; 
String[] arr2 = {"a", "b", "c", "d", "a", "b", "c", "d", "a", "b", "c", "d"}; 

int totalElems = 0; 

Map<String, Boolean> freq = new HashMap<String, Boolean>(); 

// add stuff from arr2 
for(String _b: arr2) { 
    if(!freq.containsKey(_b)) { 
     totalElems++; 
     freq.put(_b, true); 
    } 
} 

// add stuff from arr1, removing stuff that were in arr2 
for(String _a: arr1) { 
    if(freq.containsKey(_a) && freq.get(_a)) { 
     totalElems--; 
     freq.put(_a, false); 
    } 
} 

String[] c = new String[totalElems]; 
int ptr = 0; 
for(String key: freq.keySet()) { 
    if(freq.get(key)) 
     c[ptr++] = key; 
} 
System.out.println(Arrays.toString(c)); // [d] 

根据我写的内容,它应该涵盖大多数可能的情况。让我知道你是否需要进一步的帮助。如果您不能使用Maps,我所看到的唯一方法是对array B的每个元素都检查array A的所有元素,并给出所提供的信息。

我只补充一点,太..此实现应该工作(我没有测试过)

String[] c = new String[b.length]; 
int cPtr = 0; 
for(int i = 0 ; i < b.length ; i++) { 
    boolean found = false; 
    for(int j = 0 ; j < a.length ; j++) { 
     if(a[j].equals(b[i])) { 
      found = true; 
      break; 
     } 
    } 
    if(!found) 
     c[cPtr++] = b[i]; 
} 
+0

它确实,但我不被允许使用集(这是一个项目,我可能应该在原来的帖子中说,对不起)。目标是使用一组循环和开关来填充阵列C. –

+0

@ UVB-76编辑答案 –

+0

@ UVB-76它解决了您的问题吗? –