がありArrayList<String>
、そこから繰り返される文字列を削除したいと考えています。これどうやってするの?
39 に答える
で重複したくない場合はCollection
、重複を許可する を使用している理由を検討する必要がありますCollection
。繰り返し要素を削除する最も簡単な方法は、コンテンツを a に追加しSet
(重複を許可しません)、次にSet
back を に追加することArrayList
です。
Set<String> set = new HashSet<>(yourList);
yourList.clear();
yourList.addAll(set);
もちろん、これは 内の要素の順序を破壊しArrayList
ます。
をに変換するArrayList
とHashSet
効果的に重複が削除されますが、挿入順序を維持する必要がある場合は、このバリアントを使用することをお勧めします
// list is some List of Strings
Set<String> s = new LinkedHashSet<>(list);
その後、List
参照を取得する必要がある場合は、変換コンストラクターを再度使用できます。
重複したくない場合は、 の代わりにSetList
を使用してください。List
aを aに変換するにSet
は、次のコードを使用できます。
// list is some List of Strings
Set<String> s = new HashSet<String>(list);
本当に必要な場合は、同じ構造を使用して a を に変換できSet
ますList
。
リストの順序に影響を与えない方法は次のとおりです。
ArrayList l1 = new ArrayList();
ArrayList l2 = new ArrayList();
Iterator iterator = l1.iterator();
while (iterator.hasNext()) {
YourClass o = (YourClass) iterator.next();
if(!l2.contains(o)) l2.add(o);
}
l1 は元のリストで、l2 は繰り返し項目のないリストです (等号の意味に応じて、YourClass に equals メソッドがあることを確認してください)。
Java 8 ストリームは、重複する要素をリストから削除するための非常に簡単な方法を提供します。個別の方法を使用します。都市のリストがあり、そのリストから重複を削除したい場合は、1 行で実行できます -
List<String> cityList = new ArrayList<>();
cityList.add("Delhi");
cityList.add("Mumbai");
cityList.add("Bangalore");
cityList.add("Chennai");
cityList.add("Kolkata");
cityList.add("Mumbai");
cityList = cityList.stream().distinct().collect(Collectors.toList());
オプションとしてGuavaImmutableSet
からもあります(ドキュメントはこちら):
ImmutableSet.copyOf(list);
HashSetまたはもう 1 つのarraylist を使用せずに、arraylist から重複を削除することができます。
このコードを試してください..
ArrayList<String> lst = new ArrayList<String>();
lst.add("ABC");
lst.add("ABC");
lst.add("ABCD");
lst.add("ABCD");
lst.add("ABCE");
System.out.println("Duplicates List "+lst);
Object[] st = lst.toArray();
for (Object s : st) {
if (lst.indexOf(s) != lst.lastIndexOf(s)) {
lst.remove(lst.lastIndexOf(s));
}
}
System.out.println("Distinct List "+lst);
出力は
Duplicates List [ABC, ABC, ABCD, ABCD, ABCE]
Distinct List [ABC, ABCD, ABCE]
少しやり過ぎかもしれませんが、私はこの種の孤立した問題を楽しんでいます。:)
このコードは一時的な Set を (一意性チェックのために) 使用しますが、元のリスト内の要素を直接削除します。ArrayList 内の要素を削除すると大量の配列コピーが発生する可能性があるため、remove(int) メソッドは使用されません。
public static <T> void removeDuplicates(ArrayList<T> list) {
int size = list.size();
int out = 0;
{
final Set<T> encountered = new HashSet<T>();
for (int in = 0; in < size; in++) {
final T t = list.get(in);
final boolean first = encountered.add(t);
if (first) {
list.set(out++, t);
}
}
}
while (out < size) {
list.remove(--size);
}
}
作業中ですが、ここに LinkedList のバージョンを示します (はるかに優れています!)。
public static <T> void removeDuplicates(LinkedList<T> list) {
final Set<T> encountered = new HashSet<T>();
for (Iterator<T> iter = list.iterator(); iter.hasNext(); ) {
final T t = iter.next();
final boolean first = encountered.add(t);
if (!first) {
iter.remove();
}
}
}
マーカー インターフェイスを使用して、List の統一されたソリューションを提示します。
public static <T> void removeDuplicates(List<T> list) {
if (list instanceof RandomAccess) {
// use first version here
} else {
// use other version here
}
}
編集:ここでは、ジェネリックのものは実際には何の価値も追加しないと思います..まあ。:)
Order を保持したい場合は、LinkedHashSetを使用するのが最善です。このリストを反復して挿入クエリに渡したい場合は、順序が保持されるためです。
これを試して
LinkedHashSet link=new LinkedHashSet();
List listOfValues=new ArrayList();
listOfValues.add(link);
この変換は、セットではなくリストを返したい場合に非常に役立ちます。
ArrayList を埋めるときは、各要素に条件を使用します。例えば:
ArrayList< Integer > al = new ArrayList< Integer >();
// fill 1
for ( int i = 0; i <= 5; i++ )
if ( !al.contains( i ) )
al.add( i );
// fill 2
for (int i = 0; i <= 10; i++ )
if ( !al.contains( i ) )
al.add( i );
for( Integer i: al )
{
System.out.print( i + " ");
}
配列 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} を取得します
ArrayList<String> city=new ArrayList<String>();
city.add("rajkot");
city.add("gondal");
city.add("rajkot");
city.add("gova");
city.add("baroda");
city.add("morbi");
city.add("gova");
HashSet<String> hashSet = new HashSet<String>();
hashSet.addAll(city);
city.clear();
city.addAll(hashSet);
Toast.makeText(getActivity(),"" + city.toString(),Toast.LENGTH_SHORT).show();
List<String> result = new ArrayList<String>();
Set<String> set = new LinkedHashSet<String>();
String s = "ravi is a good!boy. But ravi is very nasty fellow.";
StringTokenizer st = new StringTokenizer(s, " ,. ,!");
while (st.hasMoreTokens()) {
result.add(st.nextToken());
}
System.out.println(result);
set.addAll(result);
result.clear();
result.addAll(set);
System.out.println(result);
output:
[ravi, is, a, good, boy, But, ravi, is, very, nasty, fellow]
[ravi, is, a, good, boy, But, very, nasty, fellow]
前に述べたように、List の代わりに Set インターフェイスを実装するクラスを使用して、要素の単一性を確保する必要があります。要素の順序を維持する必要がある場合は、SortedSet インターフェイスを使用できます。TreeSet クラスはそのインターフェイスを実装します。
for(int a=0;a<myArray.size();a++){
for(int b=a+1;b<myArray.size();b++){
if(myArray.get(a).equalsIgnoreCase(myArray.get(b))){
myArray.remove(b);
dups++;
b--;
}
}
}
public Set<Object> findDuplicates(List<Object> list) {
Set<Object> items = new HashSet<Object>();
Set<Object> duplicates = new HashSet<Object>();
for (Object item : list) {
if (items.contains(item)) {
duplicates.add(item);
} else {
items.add(item);
}
}
return duplicates;
}
このようなものはうまくいきますか?
public static void removeDuplicates(ArrayList<String> list) {
Arraylist<Object> ar = new Arraylist<Object>();
Arraylist<Object> tempAR = new Arraylist<Object>();
while (list.size()>0){
ar.add(list(0));
list.removeall(Collections.singleton(list(0)));
}
list.addAll(ar);
}
これは順序を維持する必要があり、実行時に 2 次であってはなりません。
これが、セットやハッシュマップなどの他のデータ構造を使用しない私の答えです。
public static <T> ArrayList<T> uniquefy(ArrayList<T> myList) {
ArrayList <T> uniqueArrayList = new ArrayList<T>();
for (int i = 0; i < myList.size(); i++){
if (!uniqueArrayList.contains(myList.get(i))){
uniqueArrayList.add(myList.get(i));
}
}
return uniqueArrayList;
}
@ jonathan-stafford ソリューションは問題ありません。しかし、これはリストの順序を保持しません。
リストの順序を維持したい場合は、これを使用する必要があります。
public static <T> void removeDuplicate(List <T> list) {
Set <T> set = new HashSet <T>();
List <T> newList = new ArrayList <T>();
for (Iterator <T>iter = list.iterator(); iter.hasNext(); ) {
Object element = iter.next();
if (set.add((T) element))
newList.add((T) element);
}
list.clear();
list.addAll(newList);
}
答えを完成させるだけです。とても良い!
リストで重複を自動的に無視して順序を維持する場合は、 HashList (HashMap が埋め込まれたリスト)を作成できます。
public static class HashList<T> extends ArrayList<T>{
private HashMap <T,T> hashMap;
public HashList(){
hashMap=new HashMap<>();
}
@Override
public boolean add(T t){
if(hashMap.get(t)==null){
hashMap.put(t,t);
return super.add(t);
}else return false;
}
@Override
public boolean addAll(Collection<? extends T> c){
HashList<T> addup=(HashList<T>)c;
for(int i=0;i<addup.size();i++){
add(addup.get(i));
}return true;
}
}
Usage Example:
HashList<String> hashlist=new HashList<>();
hashList.add("hello");
hashList.add("hello");
System.out.println(" HashList: "+hashlist);
import java.util.*;
class RemoveDupFrmString
{
public static void main(String[] args)
{
String s="appsc";
Set<Character> unique = new LinkedHashSet<Character> ();
for(char c : s.toCharArray()) {
System.out.println(unique.add(c));
}
for(char dis:unique){
System.out.println(dis);
}
}
}
ArrayList<String> list = new ArrayList<String>();
HashSet<String> unique = new LinkedHashSet<String>();
HashSet<String> dup = new LinkedHashSet<String>();
boolean b = false;
list.add("Hello");
list.add("Hello");
list.add("how");
list.add("are");
list.add("u");
list.add("u");
for(Iterator iterator= list.iterator();iterator.hasNext();)
{
String value = (String)iterator.next();
System.out.println(value);
if(b==unique.add(value))
dup.add(value);
else
unique.add(value);
}
System.out.println(unique);
System.out.println(dup);
ArrayList から重複を削除したい場合は、以下のロジックを見つけることを意味します。
public static Object[] removeDuplicate(Object[] inputArray)
{
long startTime = System.nanoTime();
int totalSize = inputArray.length;
Object[] resultArray = new Object[totalSize];
int newSize = 0;
for(int i=0; i<totalSize; i++)
{
Object value = inputArray[i];
if(value == null)
{
continue;
}
for(int j=i+1; j<totalSize; j++)
{
if(value.equals(inputArray[j]))
{
inputArray[j] = null;
}
}
resultArray[newSize++] = value;
}
long endTime = System.nanoTime()-startTime;
System.out.println("Total Time-B:"+endTime);
return resultArray;
}
Java では、List はそれらの要素への順序付きアクセスを許可します。ルックアップ キーは一部のハッシュ コードではなく位置であるため、重複する可能性があります。すべての要素は、セットが一意の要素のコレクションを表し、要素がセットされている間は変更してはなりません。セット内の要素を変更することを妨げる制限はありません。要素が変更されると、セット内で永久に失われる可能性があります。
public static void main(String[] args) {
List<String> l = new ArrayList<String>();
l.add("A");
l.add("B");
l.add("C");
l.add("A");
System.out.println("Before removing duplicates: ");
for (String s : l) {
System.out.println(s);
}
Set<String> set = new HashSet<String>(l);
List<String> newlist = new ArrayList<String>(set);
System.out.println("after removing duplicates: ");
for (String s : newlist) {
System.out.println(s);
}
}
参考までに、このリンクを参照してくださいArrayListから重複を削除する方法