web-dev-qa-db-ja.com

文字列配列の重複文字列を削除します

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]);
        }
    }
19
user1339752

これは動作します

array = new HashSet<String>(Arrays.asList(array)).toArray(new String[0]);

または、配列の代わりにHashSetを使用します。

34
Garrett Hall

提案されたソリューションは、要素の順序を維持しません。 Java 8以上を使用し、順序を維持する場合は、次のようにストリームを使用できます。

array = Arrays.stream(array).distinct().toArray(String[]::new);

完全な例: https://www.javacodeexamples.com/Java-string-array-remove-duplicates-example/849

1
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
                }
    } 
}
1
Joop Eggen

これが[homework]セットを使用します

String[] array =
Set<String> uniqueWords = new HashSet<String>(Arrays.asList(array));
1
Peter Lawrey
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]);
            }
        }
    }
}
0
ekishore4u

最後のif条件はif(n ==(array [m] .length()-1))であると思います

そうは言っても、最も内側のループでString.equals()メソッドが実行することを実装しようとしているようです。

0
Martin Prakash
     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));
        }
0
Janmejai
  • 文字列内の文字を手動で繰り返すのではなく、比較のためにString.equals()を使用しないのはなぜですか?
  • あなたのロジックには実際には欠陥があります:array[s] == "12345"array[m] == "123"の場合、それらは等しいと主張する
  • さらに、内部ループではfor(int m=0;m<array.length;m++)mもある時点でsと等しくなるため、文字列をそれ自体と比較します。

これらの注意事項は、クラスライブラリの使用を許可されていない、独自のコードで削除ロジックを実装する必要があることを前提としています。そうでない場合は、他の人が述べたように、 HashSet を使用するのが最も簡単なアプローチです。

0
Péter Török

なぜString.equals(String)を優先して最も内側のループを削除しなかったのですか?

最初の反復では、array [0]と等しいarray [0]を比較しているため、削除されます。次に、元のarray [1]をarray内の他のすべての要素と比較し、それらが等しい場合、array [1](他の要素ではない)を削除します。

いくつかの問題があります。重複する文字列がある場合、最初の文字列を削除すると、rを減らすことなく配列のサイズが小さくなるため、配列内の文字列の一部がスキップされます。

Setなどの一意性を強制するデータ構造を使用します。

配列に3つの等しい文字列がある場合に何が起こるか、何が起こるかわかりません。

いくつかのArrayIndexOutOfBoundsExceptionsに遭遇すると思います。

0
Amir Pashazadeh