Javaで、文字列配列から重複する文字列を削除する必要がある。このプログラムでは、すべての文字列のサイズが同じです。
文字列配列である「配列」には、2つの文字列が互いに似ている多くの文字列が含まれています。したがって、以下のコードを使用すると、重複する文字列を削除する必要がありますが、削除されません。
重複した文字列を削除する方法は?
次のコードを使用しています。
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]);
}
}
これは動作します
array = new HashSet<String>(Arrays.asList(array)).toArray(new String[0]);
または、配列の代わりにHashSet
を使用します。
提案されたソリューションは、要素の順序を維持しません。 Java 8以上を使用し、順序を維持する場合は、次のようにストリームを使用できます。
array = Arrays.stream(array).distinct().toArray(String[]::new);
完全な例: https://www.javacodeexamples.com/Java-string-array-remove-duplicates-example/849
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);
}
}
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
}
}
}
これが[homework]
セットを使用します
String[] array =
Set<String> uniqueWords = new HashSet<String>(Arrays.asList(array));
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]);
}
}
}
}
最後のif条件はif(n ==(array [m] .length()-1))であると思います
そうは言っても、最も内側のループでString.equals()メソッドが実行することを実装しようとしているようです。
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));
}
String.equals()
を使用しないのはなぜですか?array[s]
== "12345"
とarray[m]
== "123"
の場合、それらは等しいと主張するfor(int m=0;m<array.length;m++)
m
もある時点でs
と等しくなるため、文字列をそれ自体と比較します。これらの注意事項は、クラスライブラリの使用を許可されていない、独自のコードで削除ロジックを実装する必要があることを前提としています。そうでない場合は、他の人が述べたように、 HashSet
を使用するのが最も簡単なアプローチです。
なぜString.equals(String)
を優先して最も内側のループを削除しなかったのですか?
最初の反復では、array [0]と等しいarray [0]を比較しているため、削除されます。次に、元のarray [1]をarray内の他のすべての要素と比較し、それらが等しい場合、array [1](他の要素ではない)を削除します。
いくつかの問題があります。重複する文字列がある場合、最初の文字列を削除すると、r
を減らすことなく配列のサイズが小さくなるため、配列内の文字列の一部がスキップされます。
Setなどの一意性を強制するデータ構造を使用します。
配列に3つの等しい文字列がある場合に何が起こるか、何が起こるかわかりません。
いくつかのArrayIndexOutOfBoundsException
sに遭遇すると思います。