2017-06-15 12 views
2

値が{"16"、 "b"、 "c"、 "d"、 "e"、 "16"、 " 「f」、「g」、「16」、「b」} この16とbが繰り返されるので、私はそれらのすべてのエントリを削除したいと思います。私はc、d、e、f、gとして出力が必要です。以下のプログラムは正常に動作します。より良い解決策はありますか?要素の出現をすべて削除する方法

public class Test { 

public static void main(String[] args) { 

    ArrayList <String> l = new ArrayList <String>(); 
    String[] str = { 
    "16", 
    "b", 
    "c", 
    "d", 
    "e", 
    "16", 
    "f", 
    "g", 
    "16", 
    "b" 
    }; 


    for (String s: str) { 
    l.add(s); 
    } 
    List ll = removeDups(l); 
    l.removeAll(ll); 
    System.out.println("Final List " + l); 
} 

private static List <String> removeDups(ArrayList <String> l) { 
    List <String> ll = new ArrayList <String>(); 
    for (String a: l) { 
    int x = Collections.frequency(l, a); 
    if (x > 1) { 
    ll.add(a); 
    } 
    } 
    return ll; 
} 
} 
+0

Stackoverflowで質問を投稿する前に、コードをよく説明するかコメントしてください。誰にでも役立ちます。 –

+0

それは、実際に何も削除しないので、 'removeDups'メソッドは実際には' findDups'と呼ばれるべきです。複製されたアイテムを見つけ出すだけです。 'l.removeAll(ll)'行が 'removeDups'の中で動かされた場合、_then_' removeDups'は実際にその名前に値するでしょう。 –

+0

Collections.frequencyは 'O(n)'の順であると考えると、ハッシュマップを使うとよりうまくいくでしょう。 –

答えて

1

を行うだろうと思い各要素についてindexおよびlastIndexsameの場合、要素はuniqueです。これらの要素をフィルタリングすることができます。

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

// sample code 
String[] str = {"16","b","c","d","e","16","f","g","16","b"}; 
List<String> list = Arrays.asList(str); // List from the array 
List<String> newList = new ArrayList<String>(); 
for(String myStr : list){ 
    if(list.indexOf(myStr) == list.lastIndexOf(myStr)){ 
     /* 
     * This is a unique element as its index and lastIndex in list are same. 
     * Add it to new list. 
     */ 
     newList.add(myStr); 
    } 
} 
// Freeing resources 
str = null; 
list = null; 

System.out.println("Final List: "+ newList); 
+0

うわー。そのうまく動作します。どうもありがとうございます。 –

+0

@Sammetanagasrinivasあなたは答えをupvoteして解決策として答えを受け入れることができますか? –

2

Setを使用して、指定された配列リストから重複要素を削除できます。ここで

はサンプルコードです:

Set<String> myStrSet = new HashSet<String>(); 
Set<String> duplicateSet = new HashSet<String>(); 

     for(String str : myArrayList){ 
      if(myStrSet.contains(str)){ 
        duplicateSet.add(str); 
      } else { 
        myStrSet.add(str); 
      } 
     } 

     for(String str : duplicateSet){ 
      myStrSet.remove(str); 
     } 

     for(String str : myStrSet){ 
      System.out.println("Print non-duplicate elements : " + str); 
     } 
+2

OPは重複している配列要素の_all_インスタンスを削除したかったと思います。複製された各アイテムのインスタンスが残ります。 –

+0

はい、私はすべての発生を取り除きたいと思います。 –

+0

私はこの回答がどのように投票を取るか分かりません。複数のタイプミス(myStrListとst)があり、重複を削除しませんでした。 –

1

一つの方法は、各素子の周波数を見つけるために、ストリームを使用することです:

Map<String, Long> counts = yourList.stream() 
    .collect(Collectors.groupingBy(
     Function.identity(),  // keep the element as the key 
     Collectors.counting())); // values will be the count 

その後、あなたは上のベースの要素を削除するためにremoveIfを使用することができます上記で計算された周波数マップを使用する条件:

yourList.removeIf(elem -> counts.get(elem) > 1); 

System.out.println(yourList); // [c, d, e, f, g] 

もう1つの方法は、どの値に重複があり、どの値が一意であるかを調べることです。このために、我々はMap<String, Boolean>を使用することができます。

Map<String, Boolean> duplicates = new LinkedHashMap<>(); 
yourList.forEach(elem -> duplicates.compute(elem, (k, v) -> v != null)); 

ここで私は、リストを反復処理だし、各要素のために、私は要素が既にとして存在している場合trueとして値を計算し、マップにそれを入れています固有の場合はfalseとなります。

その後、あなたは、単にマップから値を返す述語で、リスト上のremoveIfを使用することができます。

yourList.removeIf(duplicates::get); 

System.out.println(yourList); // [c, d, e, f, g] 
+0

あなたは下の儀式を意味すると思います。これはまた、fine.for(String s:l){duplicates.put(s、(duplicates.containsKey(s)?true:false));} Iterator it = l.listIterator();のように動作しています。 \t \t一方(it.hasNext()){ \t \t \t文字列SS =(文字列)it.next(); \t \t if(duplicates.get(ss)){ \t \t \t it.remove(); \t \t \t} \t \t} –

+0

@Sammetanagasrinivasはい、それもうまくいくようです。三項演算子は必要ありません。単に 'duplicates.put(s、duplicate.containsKey(s));'は問題ありません。 –

0

私は、これはあなたがを比較することができ

public class DeleteDuplicates { 

    public static void main(String[] args) { 

     String[] str={"16","b","c","d","e","16","f","g","16","b"}; 
     List<String> l= new ArrayList<String>(); 
     Set<String> set = new HashSet<String>(); 

     for(String string : str) { 

      if(set.add(string)) 
       l.add(string); 
      else 
       l.remove(string); 
     }    

     System.out.println(l); 
    } 
} 
関連する問題