Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #38830

Re: Interview question - better solution for MergePurgeAndReverseOrder()

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>

Show all headers | View raw


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 | NextPrevious in thread | Next in thread | Find similar | Unroll thread


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