Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #35223
| From | Daniel Pitts <usenet@coloraura.com> |
|---|---|
| Newsgroups | comp.lang.java.programmer |
| Subject | Re: DeDup an ArrayList |
| Date | 2016-08-06 09:18 -0700 |
| Organization | A noiseless patient Spider |
| Message-ID | <no52l2$r6h$1@dont-email.me> (permalink) |
| References | <21r7qb1srdvnieuufjquie2qrfujso6l7p@4ax.com> <no2bs0$u7g$1@dont-email.me> <no2d2n$284$1@dont-email.me> <no2fvm$cb3$1@dont-email.me> |
On 8/5/16 9:47 AM, Knute Johnson wrote:
> On 8/5/2016 08:58, Knute Johnson wrote:
>> On 8/5/2016 08:37, Daniel Pitts wrote:
>>> 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<String> list = new ArrayList<>(Arrays.asList(
>>> "First",
>>> "Second",
>>> "first",
>>> "Third",
>>> "third",
>>> "second",
>>> "Last"));
>>>
>>>
>>> final List<String> result =
>>> list.stream()
>>> .collect(
>>> Collectors.groupingBy(
>>> String::toLowerCase,
>>> LinkedHashMap<String, List<String>>::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<String> list = new ArrayList<>(Arrays.asList(
>>> "First",
>>> "Second",
>>> "first",
>>> "Third",
>>> "third",
>>> "second",
>>> "Last"));
>>>
>>> final Set<String> exists = new HashSet<>();
>>> for (final Iterator<String> i = list.iterator(); i.hasNext();) {
>>> if (!exists.add(i.next().toLowerCase())) {
>>> i.remove();
>>> }
>>> }
>>>
>>> list.forEach(System.out::println);
>>> }
>>> }
>>>
>>> ************************************************************************************************
>>>
>
> My solutions were staggeringly slow and yours were extremely fast. Your
> solution with the streams took 0.078 seconds to scan 100,000 strings
> with .08% dups, the HashSet solution took only 0.015 seconds for the
> same scan, about 5 times as fast. The only wrinkle I see is that the
> original element is permanently changed to lower case.
Check again, both of my solutions actually keep the case and order the same.
> I did see some discussions prior to Java 8 that the developers were
> originally going to create a distinct method for streams that would take
> a Comparable for an argument.
My streams one isn't the most optimal, someone else posted one that
didn't use groupingBy, but reduce instead, and was more elegant IMO.
Mine could run into issues if there were a large number of duplicates
(it would create a list of every duplicate.)
In the second "Dedup", I could also use a TreeSet with
String.CASE_INSENSITIVE_ORDER, which would be safer than my solutions
for some languages, and faster than yours for most cases.
Back to comp.lang.java.programmer | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
DeDup an ArrayList Roedy Green <inquiry@mindprod.com> - 2016-08-04 18:35 -0700
Re: DeDup an ArrayList Andreas Leitgeb <avl@logic.at> - 2016-08-05 02:05 +0000
Re: DeDup an ArrayList Arne Vajhøj <arne@vajhoej.dk> - 2016-08-04 22:41 -0400
Re: DeDup an ArrayList Lew <lewbloch@gmail.com> - 2016-08-05 15:38 -0700
Re: DeDup an ArrayList Andreas Leitgeb <avl@logic.at> - 2016-08-06 12:10 +0000
Re: DeDup an ArrayList Roedy Green <inquiry@mindprod.com> - 2016-08-04 19:06 -0700
Re: DeDup an ArrayList Eric Douglas <e.d.programmer@gmail.com> - 2016-08-05 05:16 -0700
Re: DeDup an ArrayList Andreas Leitgeb <avl@logic.at> - 2016-08-05 15:30 +0000
Re: DeDup an ArrayList Eric Douglas <e.d.programmer@gmail.com> - 2016-08-05 10:10 -0700
Re: DeDup an ArrayList Eric Sosman <esosman@comcast-dot-net.invalid> - 2016-08-05 13:51 -0400
Re: DeDup an ArrayList Eric Douglas <e.d.programmer@gmail.com> - 2016-08-05 12:16 -0700
Re: DeDup an ArrayList Eric Sosman <esosman@comcast-dot-net.invalid> - 2016-08-05 15:38 -0400
Re: DeDup an ArrayList Marcel Mueller <news.5.maazl@spamgourmet.org> - 2016-08-06 00:47 +0200
Re: DeDup an ArrayList Arne Vajhøj <arne@vajhoej.dk> - 2016-08-05 09:02 -0400
Re: DeDup an ArrayList Jan Burse <janburse@fastmail.fm> - 2016-08-05 12:52 +0200
Re: DeDup an ArrayList Jan Burse <janburse@fastmail.fm> - 2016-08-05 12:53 +0200
Re: DeDup an ArrayList Jan Burse <janburse@fastmail.fm> - 2016-08-05 13:10 +0200
Re: DeDup an ArrayList Jan Burse <janburse@fastmail.fm> - 2016-08-13 12:26 +0200
Re: DeDup an ArrayList Daniel Pitts <usenet@coloraura.com> - 2016-08-05 08:37 -0700
Re: DeDup an ArrayList Knute Johnson <nospam@rabbitbrush.frazmtn.com> - 2016-08-05 08:58 -0700
Re: DeDup an ArrayList Knute Johnson <nospam@rabbitbrush.frazmtn.com> - 2016-08-05 09:47 -0700
Re: DeDup an ArrayList Knute Johnson <nospam@rabbitbrush.frazmtn.com> - 2016-08-05 19:56 -0700
Re: DeDup an ArrayList Daniel Pitts <usenet@coloraura.com> - 2016-08-06 09:18 -0700
Re: DeDup an ArrayList Marcel Mueller <news.5.maazl@spamgourmet.org> - 2016-08-06 01:04 +0200
Re: DeDup an ArrayList Roedy Green <inquiry@mindprod.com> - 2016-08-05 16:31 -0700
csiph-web