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


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

SortedMap: getting value for largest key less or equal a given

From "Andreas Leitgeb" <andreas.leitgeb@1:261/38.remove-yy0-this>
Subject SortedMap: getting value for largest key less or equal a given
Message-ID <501C1561.56004.calajapr@time.synchro.net> (permalink)
Newsgroups comp.lang.java.programmer
Date 2012-08-03 18:54 +0000
Organization tds.net

Show all headers | View raw


From: "Andreas Leitgeb" <andreas.leitgeb@1:261/38.remove-s5y-this>

From: Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at>

I've got an approach like the following, but I'm not entirely happy with it. 
(see embedded comments) Error checking left out only for brevity-of-post's 
sake.

<sscce>
class StepFunction<K,V> {
   SortedMap<K,V> m_map = new TreeMap<K,V>();
   public void put(K k,V v) { m_map.put(k,v); } // for demo-fill

   /** @return the value for the largest key in the map
          that is less OR equal to the given parameter.  */

   public V value(K k) {
      // not really correct for generic use. In my usecase, K is
      //  actually Long, so I just add one to k to make it work.
      return m_map.get(m_map.headMap(k).lastKey());

      // I'm a bit unhappy about headMap's "open end",
      // and also about the lack of some method like
      //   lastEntry() or lastKeysValue() in SortedMap,
      // requiring one to look up the lastKey in the map,
      // although the map had "its finger on it" just before.
      //   Did I miss something simple and obvious?
   }
   // demo-helper
   void checkVal(K k, V v) {
      System.out.println( map.value(k) + " should be " + v);
   }
   public static void main(String[] args) {
      StepFunction<Integer,Double> sf = new StepFunction<>()
      sf.put(Integer.MIN_VALUE, -1.0);
      sf.put(0, 0.0); sf.put(2, 1.0);

      sf.checkVal(-1 , -1.0);
      sf.checkVal( 0 ,  0.0);
      sf.checkVal( 1 ,  0.0);
      sf.checkVal( 2 ,  1.0);
      sf.checkVal(Integer.MAX_VALUE , 1.0);
   }
}
</sscce>

PS: No need to offer "solutions" involving linear search.
  I could have come up with one, myself, if I wanted one.

-+- BBBS/Li6 v4.10 Dada-1
 + Origin: Prism bbs (1:261/38)
-+- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24

--- BBBS/Li6 v4.10 Dada-1
 * Origin: Prism bbs (1:261/38)
--- Synchronet 3.16a-Win32 NewsLink 1.98
Time Warp of the Future BBS - telnet://time.synchro.net:24

Back to comp.lang.java.programmer | Previous | NextNext in thread | Find similar | Unroll thread


Thread

SortedMap: getting value for largest key less or equal a given "Andreas Leitgeb" <andreas.leitgeb@1:261/38.remove-yy0-this> - 2012-08-03 18:54 +0000
  Re: SortedMap: getting value for largest key less or equal a given "Andreas Leitgeb" <andreas.leitgeb@1:261/38.remove-yy0-this> - 2012-08-03 18:54 +0000
    Re: SortedMap: getting value for largest key less or equal a given "markspace" <markspace@1:261/38.remove-yy0-this> - 2012-08-03 18:54 +0000

csiph-web