删除字符串数组中的重复字符串
Posted
技术标签:
【中文标题】删除字符串数组中的重复字符串【英文标题】:Delete duplicate strings in string array 【发布时间】:2012-05-09 03:49:33 【问题描述】:我正在编写一个基于 Java 中的字符串处理的程序,其中我需要从字符串数组中删除重复的字符串。在这个程序中,所有字符串的大小都是一样的。
'array' 是一个字符串数组,包含多个字符串,其中两个字符串彼此相似。因此,使用下面的代码必须删除重复的字符串,但不会删除它。
如何去除重复的字符串?
我正在使用以下代码。
for(int s=0;s<array.length-1;s++)
for(int m=0;m<array.length;m++)
for(int n=0;n<array[m].length();n++)
if(array[s].charAt(n)==array[m].charAt(n))
continue;
else
break;
if(n==array[m].length())
ArrayUtils.removeElement(array, array[s]);
【问题讨论】:
你现在得到的代码到底有什么问题? 为什么不使用更适合删除重复项的结构,例如 HashSet,而不是数组? 你能告诉我使用hashset的代码是什么吗? 【参考方案1】:这会起作用
array = new HashSet<String>(Arrays.asList(array)).toArray(new String[0]);
或者只使用HashSet
而不是数组。
【讨论】:
new String[0]
的目的是什么?【参考方案2】:
Set<String> set = new HashSet<String>();
Collections.addAll(set, array);
或以
开头for(int s=0;s<array.length-1;s++)
for(int m=s + 1;m<array.length;m++)
if(array[s] != null && array[s].equals(array[m]))
// array = ArrayUtils.removeElement(array, array[s]); --m;??
array[m] = null; // Mark for deletion later on
【讨论】:
【参考方案3】:除非这是 [homework]
,否则我会使用 Set
String[] array =
Set<String> uniqueWords = new HashSet<String>(Arrays.asList(array));
【讨论】:
【参考方案4】: 为什么不使用String.equals()
进行比较,而不是手动遍历字符串中的字符?
您的逻辑实际上是有缺陷的:对于 array[s]
== "12345"
和 array[m]
== "123"
它会声称它们是相等的
此外,在您的内部循环中,for(int m=0;m<array.length;m++)
m
在某些时候也将等于 s
,因此您会将字符串与其自身进行比较
这些说明假定您需要使用自己的代码实现删除逻辑,不允许使用类库。如果不是这种情况,正如其他人指出的那样,使用HashSet
是最简单的方法。
【讨论】:
【参考方案5】:您为什么不删除最内部的循环以支持String.equals(String)
?
在第一次迭代中,您将 array[0] 与 array[0] 进行比较,它们相等,它将被删除。然后将原始数组[1] 与数组中的所有其他元素进行比较,如果它们相等,则删除数组[1](而不是另一个)。
有一些问题,如果有一些重复的字符串,你正在删除第一个,这将减少数组的大小而不减少r
所以,数组中的一些字符串被跳过了。
我会使用强制唯一性的数据结构,例如 Set。
如果你的数组中有 3 个相等的字符串会发生什么,我不确定会发生什么。
相信你会遇到一些ArrayIndexOutOfBoundsException
s。
【讨论】:
【参考方案6】:我认为最后的 if 条件应该是 if(n==(array[m].length()-1))
话虽如此,您似乎正在尝试实现 String.equals() 方法在您的最内层循环中所做的事情。
【讨论】:
【参考方案7】:重复整数删除:这是完美的答案 /// 哈里斯 ///
public static void duplicateRemove(int[] arr)
int temp = 0;
for (int i = 0; i < arr.length; i++)
for (int j = 0; j < arr.length; j++)
if (arr[i] < arr[j])
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
int count;
for (int j = 0; j < arr.length;)
count = 1;
for (int i = j + 1; i < arr.length; i++)
if (arr[i] == arr[j])
count++;
else
break;
System.out.println(arr[j] + " is : " + count);
j += count;
【讨论】:
问题是关于删除重复的字符串而不是整数【参考方案8】: String[] arr = "w10","w20","w10","w30","w20","w40","w50","w50";
List<String> arrList = new ArrayList<String>();
int cnt= 0;
//List<String> arrList = Arrays.asList(arr);
List<String> lenList = new ArrayList<String>();
for(int i=0;i<arr.length;i++)
for(int j=i+1;j<arr.length;j++)
if(arr[i].equals(arr[j]))
cnt+=1;
if(cnt<1)
arrList.add(arr[i]);
cnt=0;
for(int k=0;k<arrList.size();k++)
System.out.println("Array without Duplicates: "+arrList.get(k));
【讨论】:
【参考方案9】:建议的解决方案不保持元素的顺序。如果您使用 Java 8 或更高版本并希望保持顺序,您可以按如下方式使用流:
array = Arrays.stream(array).distinct().toArray(String[]::new);
完整示例:https://www.javacodeexamples.com/java-string-array-remove-duplicates-example/849
【讨论】:
【参考方案10】:import java.util.*;
public class Stringarray
public static void main(String args[])
String[] name = "aim","rajesh","raju","aim";
Set<String> myset = new HashSet<String>();
Collections.addAll(myset,name);
System.out.println(myset);
【讨论】:
【参考方案11】:List<String> al = new ArrayList<String>();
String[] months="Jan","Feb","Mar","Apr","Jan","Mar","May","May";
for(int i=0;i<months.length;i++)
for(int j=1;j<months.length;j++)
if(months[i].equalsIgnoreCase(months[j]))
if(!al.contains(months[i]))
al.add(months[i]);
【讨论】:
【参考方案12】:Sring[] myStringArray = "hello", "hello", "moto";
String[] filteredArray = new LinkedHashSet<String>(Arrays.asList(myStringArray))
.toArray(new String[0]);
System.out.println("filteredArray Size: " + filteredArray.length);
System.out.println("filteredArray[0] = " + filteredArray[0]);
System.out.println("filteredArray[1] = " + filteredArray[1]);
【讨论】:
【参考方案13】:设置数据结构将自动完成这项工作。
您最有可能的选择是HashSet
,如果您关心元素的顺序,请查看TreeSet
List<String> input = Arrays.asList(array);
Set<String> unique = new HashSet<>(input);
【讨论】:
【参考方案14】:public static List<String> sortHandleArrayList(String... arrayInput)
List<String> list = new ArrayList<>();
for (String string : arrayInput)
if (!list.contains(string))
list.add(string);
Collections.sort(list);
return list;
【讨论】:
【参考方案15】:在不使用 Collection 的情况下从 String[] 中删除重复的字符串
public static void removeDuplicate(String[] str, int size)
for(int i=0; i<size-1; i++)
if(str[i]!=null)
for(int j=i+1; j<size-1; j++)
if(str[i].equals(str[j]))
str[j]=null;
for(int i=0; i<size;i++)
if(str[i]==null)
continue;
System.out.println(str[i]);
【讨论】:
以上是关于删除字符串数组中的重复字符串的主要内容,如果未能解决你的问题,请参考以下文章