Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #38830
| From | Eric Sosman <esosman@comcast-dot-net.invalid> |
|---|---|
| Newsgroups | comp.lang.java.programmer |
| Subject | Re: Interview question - better solution for MergePurgeAndReverseOrder() |
| Date | 2019-03-29 13:47 -0400 |
| Organization | A noiseless patient Spider |
| Message-ID | <q7llnj$loj$1@dont-email.me> (permalink) |
| References | <q7lbvc$152e$1@gioia.aioe.org> <q7ld2o$vqp$1@dont-email.me> <q7lhto$11u$1@gioia.aioe.org> |
On 3/29/2019 12:42 PM, Graeme Geldenhuys wrote:
> On 29/03/2019 15:19, Eric Sosman wrote:
>> I personally would have written the rest somewhat differently
>> than you did, but the differences don't seem important. Matters
>> of taste, as I wrote earlier.
>
> Thank you for your feedback.
>
> Only if you have the time, could you show me how you would have
> implemented that method. I like to educate myself further in different
> ways of doing things (Java's libraries are daunting to learn, and I'm
> bound to miss out on some parts). I'm trying to get to grips on all the
> ways of using the various Collection classes in Java.
Here's one way (just typed in, not tested):
public static int[] MergePurgeAndReverseSort_1(
Integer[] values1, Integer[] values2, boolean reverse) {
Set<Integer> allValues = new HashSet<>();
for (Integer value : values1) {
if (value != null) {
allValues.add(value);
}
}
for (Integer value : values2) {
if (value != null) {
allValues.add(value);
}
}
Comparator<Integer> compare = reverse
? Collections.reverseOrder() : Integer::compare;
return allValues.stream()
.sorted(compare)
.mapToInt(Integer::intValue)
.toArray();
}
This has a nagging infelicity: The null-test-and-add must be written
twice. Whenever "the same thing" is written more than once there's a
chance that the appearances might disagree slightly (imagine a more
complex test and a maintenance programmer working hastily), so it's
almost always better to write such things once only. One way would
be to write two unconditional adds and follow the two loops with a
single allValues.remove(null) to purge any undesirables; another would
be to make all the values flow through a single test-and-add:
public static int[] MergePurgeAndReverseSort_2(
Integer[] values1, Integer[] values2, boolean reverse) {
Set<Integer> allValues = Stream.concat(
Arrays.asList(values1).stream(),
Arrays.asList(values2).stream())
.filter((value) -> value != null)
.collect(Collectors.toSet());
Comparator<Integer> compare = reverse
? Collections.reverseOrder() : Integer::compare;
return allValues.stream()
.sorted(compare)
.mapToInt(Integer::intValue)
.toArray();
}
Having come this far, and following the principle that one might as
well be hanged for a sheep as for a lamb, we arrive at:
public static int[] MergePurgeAndReverseSort_3(
Integer[] values1, Integer[] values2, boolean reverse) {
return Stream.concat(
Arrays.asList(values1).stream(),
Arrays.asList(values2).stream())
.filter((value) -> value != null)
.distinct()
.sorted(reverse ? Collections.reverseOrder() :
Integer::compare)
.mapToInt(Integer::intValue)
.toArray();
}
... and proudly announce "It's a one-liner!" (The APL fans, of course,
sneer at us.)
So: No big deal, just lots of ways to acquire cats' skins.
--
esosman@comcast-dot-net.invalid
Six hundred sixty-three days to go.
Back to comp.lang.java.programmer | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Interview question - better solution for MergePurgeAndReverseOrder() Graeme Geldenhuys <graemeg@example.net> - 2019-03-29 15:01 +0000
Re: Interview question - better solution for MergePurgeAndReverseOrder() Eric Sosman <esosman@comcast-dot-net.invalid> - 2019-03-29 11:19 -0400
Re: Interview question - better solution for MergePurgeAndReverseOrder() Graeme Geldenhuys <graemeg@example.net> - 2019-03-29 16:42 +0000
Re: Interview question - better solution for MergePurgeAndReverseOrder() Eric Sosman <esosman@comcast-dot-net.invalid> - 2019-03-29 13:47 -0400
Re: Interview question - better solution for MergePurgeAndReverseOrder() Eric Sosman <esosman@comcast-dot-net.invalid> - 2019-03-29 13:53 -0400
Re: Interview question - better solution for MergePurgeAndReverseOrder() Daniele Futtorovic <da.futt.news@laposte-dot-net.invalid> - 2019-03-29 19:42 +0100
Re: Interview question - better solution for MergePurgeAndReverseOrder() Graeme Geldenhuys <graemeg@example.net> - 2019-03-29 16:53 +0000
Re: Interview question - better solution for MergePurgeAndReverseOrder() Eric Douglas <e.d.programmer@gmail.com> - 2019-03-29 10:19 -0700
Re: Interview question - better solution for MergePurgeAndReverseOrder() Jukka Lahtinen <jtfjdehf@hotmail.com.invalid> - 2019-03-30 11:23 +0200
Re: Interview question - better solution for MergePurgeAndReverseOrder() Graeme Geldenhuys <graemeg@example.net> - 2019-03-30 11:16 +0000
Re: Interview question - better solution for MergePurgeAndReverseOrder() Eric Douglas <e.d.programmer@gmail.com> - 2019-03-29 13:20 -0700
Re: Interview question - better solution for MergePurgeAndReverseOrder() Graeme Geldenhuys <graemeg@example.net> - 2019-03-30 11:21 +0000
Re: Interview question - better solution for MergePurgeAndReverseOrder() Eric Douglas <e.d.programmer@gmail.com> - 2019-04-01 04:56 -0700
Re: Interview question - better solution for MergePurgeAndReverseOrder() bursejan@gmail.com - 2019-03-29 15:40 -0700
csiph-web