Path: csiph.com!eternal-september.org!feeder.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Daniel Pitts Newsgroups: comp.lang.java.programmer Subject: Re: DeDup an ArrayList Date: Fri, 5 Aug 2016 08:37:36 -0700 Organization: A noiseless patient Spider Lines: 84 Message-ID: References: <21r7qb1srdvnieuufjquie2qrfujso6l7p@4ax.com> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Fri, 5 Aug 2016 15:37:36 -0000 (UTC) Injection-Info: mx02.eternal-september.org; posting-host="52d75d4f464574e0a92ef19ca2bbcfd4"; logging-data="30960"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX18DqZqru4shI8ghricmW8tkZQhOvuD5kvg=" User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 In-Reply-To: <21r7qb1srdvnieuufjquie2qrfujso6l7p@4ax.com> Cancel-Lock: sha1:4WctsyMuHxYYSrgH+FN+rS4hDAc= Xref: csiph.com comp.lang.java.programmer:35207 On 8/4/16 6:35 PM, Roedy Green wrote: > This looks like trivial task, but every time I work on it, it keeps > ballooning in complexity. > > I wish to deDup an ArrayList. Any two strings equalIgnoreCase are > considered dups. One should be removed. The order of the items should > be otherwise be undisturbed. > > Part of the trouble is removing an element from an ArrayList makes you > lose track of where you are. > Stream version: -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= import java.util.*; import java.util.stream.Collectors; public class Dedup { public static void main(String[] args) { final List list = new ArrayList<>(Arrays.asList( "First", "Second", "first", "Third", "third", "second", "Last")); final List result = list.stream() .collect( Collectors.groupingBy( String::toLowerCase, LinkedHashMap>::new, Collectors.toList() ) ) .entrySet() .stream() .map(Map.Entry::getValue) .map(l -> l.get(0)) .collect(Collectors.toList()); result.forEach(System.out::println); } } ************************************************************************************************ In-place non-stream version: -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= import java.util.*; public class Dedup { public static void main(String[] args) { final List list = new ArrayList<>(Arrays.asList( "First", "Second", "first", "Third", "third", "second", "Last")); final Set exists = new HashSet<>(); for (final Iterator i = list.iterator(); i.hasNext();) { if (!exists.add(i.next().toLowerCase())) { i.remove(); } } list.forEach(System.out::println); } } ************************************************************************************************