HashMap/Hashtable not returning int as key value in for loop










2














When I am trying to access map.get(c) in for loop (as shown in version 2), it returns null value and sets upper bound to be null, resulting in null-pointer exception. On the other hand, if I create end variable and assign it map.get(c) value (as shown in version 1), it works fine. So, would you please explain me why?



version 1: Works perfectly fine



 int count=0;
int st=0;
string s = "abcabcbb";

Hashtable<Character, Integer> map = new Hashtable<Character, Integer>();

char str = s.toCharArray();
for(int i=0; i<str.length; i++)
char c = str[i];
if(map.get(c)==null)
map.put(c, i);

if(count < map.get(c) - st + 1)
count = map.get(c) - st + 1;
;



else
int end = map.get(c); // End variable --> returns int value as expected

for(int j=st; j<=end; j++)
map.remove(str[j]);
st = j+1;

map.put(c,i);




System.out.println(count);


Version 2: Gives null-pointer exception



 int count=0;
int st=0;
string s = "abcabcbb";

Hashtable<Character, Integer> map = new Hashtable<Character, Integer>();

char str = s.toCharArray();
for(int i=0; i<str.length; i++)
char c = str[i];
if(map.get(c)==null)
map.put(c, i);

if(count < map.get(c) - st + 1)
count = map.get(c) - st + 1;
;



else
//int end = map.get(c); // End variable commented

for(int j=st; j<=map.get(c); j++) // replaced end w map.get(c) --> returns null instead of int
map.remove(str[j]);
st = j+1;

map.put(c,i);




System.out.println(count);


Thanks for your help in advance!
Rohan.










share|improve this question





















  • Also stackoverflow.com/questions/40471/…
    – azro
    Nov 11 at 0:25















2














When I am trying to access map.get(c) in for loop (as shown in version 2), it returns null value and sets upper bound to be null, resulting in null-pointer exception. On the other hand, if I create end variable and assign it map.get(c) value (as shown in version 1), it works fine. So, would you please explain me why?



version 1: Works perfectly fine



 int count=0;
int st=0;
string s = "abcabcbb";

Hashtable<Character, Integer> map = new Hashtable<Character, Integer>();

char str = s.toCharArray();
for(int i=0; i<str.length; i++)
char c = str[i];
if(map.get(c)==null)
map.put(c, i);

if(count < map.get(c) - st + 1)
count = map.get(c) - st + 1;
;



else
int end = map.get(c); // End variable --> returns int value as expected

for(int j=st; j<=end; j++)
map.remove(str[j]);
st = j+1;

map.put(c,i);




System.out.println(count);


Version 2: Gives null-pointer exception



 int count=0;
int st=0;
string s = "abcabcbb";

Hashtable<Character, Integer> map = new Hashtable<Character, Integer>();

char str = s.toCharArray();
for(int i=0; i<str.length; i++)
char c = str[i];
if(map.get(c)==null)
map.put(c, i);

if(count < map.get(c) - st + 1)
count = map.get(c) - st + 1;
;



else
//int end = map.get(c); // End variable commented

for(int j=st; j<=map.get(c); j++) // replaced end w map.get(c) --> returns null instead of int
map.remove(str[j]);
st = j+1;

map.put(c,i);




System.out.println(count);


Thanks for your help in advance!
Rohan.










share|improve this question





















  • Also stackoverflow.com/questions/40471/…
    – azro
    Nov 11 at 0:25













2












2








2







When I am trying to access map.get(c) in for loop (as shown in version 2), it returns null value and sets upper bound to be null, resulting in null-pointer exception. On the other hand, if I create end variable and assign it map.get(c) value (as shown in version 1), it works fine. So, would you please explain me why?



version 1: Works perfectly fine



 int count=0;
int st=0;
string s = "abcabcbb";

Hashtable<Character, Integer> map = new Hashtable<Character, Integer>();

char str = s.toCharArray();
for(int i=0; i<str.length; i++)
char c = str[i];
if(map.get(c)==null)
map.put(c, i);

if(count < map.get(c) - st + 1)
count = map.get(c) - st + 1;
;



else
int end = map.get(c); // End variable --> returns int value as expected

for(int j=st; j<=end; j++)
map.remove(str[j]);
st = j+1;

map.put(c,i);




System.out.println(count);


Version 2: Gives null-pointer exception



 int count=0;
int st=0;
string s = "abcabcbb";

Hashtable<Character, Integer> map = new Hashtable<Character, Integer>();

char str = s.toCharArray();
for(int i=0; i<str.length; i++)
char c = str[i];
if(map.get(c)==null)
map.put(c, i);

if(count < map.get(c) - st + 1)
count = map.get(c) - st + 1;
;



else
//int end = map.get(c); // End variable commented

for(int j=st; j<=map.get(c); j++) // replaced end w map.get(c) --> returns null instead of int
map.remove(str[j]);
st = j+1;

map.put(c,i);




System.out.println(count);


Thanks for your help in advance!
Rohan.










share|improve this question













When I am trying to access map.get(c) in for loop (as shown in version 2), it returns null value and sets upper bound to be null, resulting in null-pointer exception. On the other hand, if I create end variable and assign it map.get(c) value (as shown in version 1), it works fine. So, would you please explain me why?



version 1: Works perfectly fine



 int count=0;
int st=0;
string s = "abcabcbb";

Hashtable<Character, Integer> map = new Hashtable<Character, Integer>();

char str = s.toCharArray();
for(int i=0; i<str.length; i++)
char c = str[i];
if(map.get(c)==null)
map.put(c, i);

if(count < map.get(c) - st + 1)
count = map.get(c) - st + 1;
;



else
int end = map.get(c); // End variable --> returns int value as expected

for(int j=st; j<=end; j++)
map.remove(str[j]);
st = j+1;

map.put(c,i);




System.out.println(count);


Version 2: Gives null-pointer exception



 int count=0;
int st=0;
string s = "abcabcbb";

Hashtable<Character, Integer> map = new Hashtable<Character, Integer>();

char str = s.toCharArray();
for(int i=0; i<str.length; i++)
char c = str[i];
if(map.get(c)==null)
map.put(c, i);

if(count < map.get(c) - st + 1)
count = map.get(c) - st + 1;
;



else
//int end = map.get(c); // End variable commented

for(int j=st; j<=map.get(c); j++) // replaced end w map.get(c) --> returns null instead of int
map.remove(str[j]);
st = j+1;

map.put(c,i);




System.out.println(count);


Thanks for your help in advance!
Rohan.







java hashmap hashtable






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 11 at 0:14









Rohan

111




111











  • Also stackoverflow.com/questions/40471/…
    – azro
    Nov 11 at 0:25
















  • Also stackoverflow.com/questions/40471/…
    – azro
    Nov 11 at 0:25















Also stackoverflow.com/questions/40471/…
– azro
Nov 11 at 0:25




Also stackoverflow.com/questions/40471/…
– azro
Nov 11 at 0:25












1 Answer
1






active

oldest

votes


















1














A for-loop runs until its condition is not met (in your case, until j <= map.get(c) is false). This condition is also not cached, as shown by the output of the code below:



public static void main(String args) 
for (int i = 0; i < getCondition(); i++)




private static int getCondition()
System.out.println("Test");
return 3;



Output:



Test
Test
Test
Test


For that reason, map.get(c) will be called for each iteration of the for-loop. If you happen to remove the entry with key c from map, then the value returned from Map#get is null, which is what causes the NullPointerException.






share|improve this answer




















    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53244688%2fhashmap-hashtable-not-returning-int-as-key-value-in-for-loop%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    A for-loop runs until its condition is not met (in your case, until j <= map.get(c) is false). This condition is also not cached, as shown by the output of the code below:



    public static void main(String args) 
    for (int i = 0; i < getCondition(); i++)




    private static int getCondition()
    System.out.println("Test");
    return 3;



    Output:



    Test
    Test
    Test
    Test


    For that reason, map.get(c) will be called for each iteration of the for-loop. If you happen to remove the entry with key c from map, then the value returned from Map#get is null, which is what causes the NullPointerException.






    share|improve this answer

























      1














      A for-loop runs until its condition is not met (in your case, until j <= map.get(c) is false). This condition is also not cached, as shown by the output of the code below:



      public static void main(String args) 
      for (int i = 0; i < getCondition(); i++)




      private static int getCondition()
      System.out.println("Test");
      return 3;



      Output:



      Test
      Test
      Test
      Test


      For that reason, map.get(c) will be called for each iteration of the for-loop. If you happen to remove the entry with key c from map, then the value returned from Map#get is null, which is what causes the NullPointerException.






      share|improve this answer























        1












        1








        1






        A for-loop runs until its condition is not met (in your case, until j <= map.get(c) is false). This condition is also not cached, as shown by the output of the code below:



        public static void main(String args) 
        for (int i = 0; i < getCondition(); i++)




        private static int getCondition()
        System.out.println("Test");
        return 3;



        Output:



        Test
        Test
        Test
        Test


        For that reason, map.get(c) will be called for each iteration of the for-loop. If you happen to remove the entry with key c from map, then the value returned from Map#get is null, which is what causes the NullPointerException.






        share|improve this answer












        A for-loop runs until its condition is not met (in your case, until j <= map.get(c) is false). This condition is also not cached, as shown by the output of the code below:



        public static void main(String args) 
        for (int i = 0; i < getCondition(); i++)




        private static int getCondition()
        System.out.println("Test");
        return 3;



        Output:



        Test
        Test
        Test
        Test


        For that reason, map.get(c) will be called for each iteration of the for-loop. If you happen to remove the entry with key c from map, then the value returned from Map#get is null, which is what causes the NullPointerException.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 11 at 0:24









        Jacob G.

        15.2k52162




        15.2k52162



























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid …


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid …


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53244688%2fhashmap-hashtable-not-returning-int-as-key-value-in-for-loop%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Top Tejano songwriter Luis Silva dead of heart attack at 64

            ReactJS Fetched API data displays live - need Data displayed static

            Evgeni Malkin