wordmultiple challenge

Hi,

I am working on below challenge




wordMultiple
Given an array of strings, return a Map<String, Boolean> where each different string is a key and its value is true if that string appears 2 or more times in the array.

wordMultiple(["a", "b", "a", "c", "b"]) → {"b": true, "c": false, "a": true}
wordMultiple(["c", "b", "a"]) → {"b": false, "c": false, "a": false}
wordMultiple(["c", "c", "c", "c"]) → {"c": true}

do i need to care about the output sorting of values like alphabetical ascending or descending etc.

please advise
LVL 7
gudii9Asked:
Who is Participating?
 
zzynxSoftware engineerCommented:
If you would like to use

 for (String buffer:strings) {

Open in new window


that's a replacement for these TWO lines of code:

for (int i = 0; i < strings.length; i++) {
        String buffer = strings[i];

Open in new window


Another imrpovement:
1) no need for intermediate variables
2) once you've counted two instances, there's no need to further "manipulating" your maps. Since it won't change the outcome.

public Map<String, Boolean> wordMultiple(String[] strings) {
   Map < String, Boolean > boolMap = new HashMap();
   Map < String, Integer > intMap = new HashMap();
  
   for (String buffer:strings) {
      if (boolMap.containsKey(buffer) && boolMap.get(buffer)) {
        continue;
      }
      if (intMap.containsKey(buffer)) {
          intMap.put(buffer, intMap.get(buffer)+1);
      } else {
          intMap.put(buffer, 1);
      }
      boolMap.put(buffer, intMap.get(buffer) >= 2);
   }
   return boolMap;    
}

Open in new window

0
 
Amitkumar PSr. ConsultantCommented:
Looking at results, sorting is not the requirement.
{"b": true, "c": false, "a": true}
{"b": false, "c": false, "a": false}
{"c": true}

You will need to iterate thru an array and keep a count of strings. Once counted then you need to check if it is more than two.
0
 
zzynxSoftware engineerCommented:
do i need to care about the output sorting of values like alphabetical ascending or descending etc.
Does the challenge asks for that? No.
It asks for return a Map. And by nature a Map simply has no key sorting. (a SortedMap has)
0
Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

 
gudii9Author Commented:
Here is actual link

http://codingbat.com/prob/p190862

It asks for return a Map. And by nature a Map simply has no key sorting. (a SortedMap has)
only Map not SorterMap here.
0
 
phoffricCommented:
If you click on the MAP link in the challenge question, you see that you are actually returning a hashmap which is not sorted.
As you know, hashing usually removes any sorted order.
So the answer to your question is: No.

Even the examples you show in the OP show no ordering.
0
 
gudii9Author Commented:
public Map < String, Boolean > wordMultiple(String[] strings) {
    Map < String, Boolean > boolMap = new HashMap();
    Map < String, Integer > intMap = new HashMap();

    for (int i = 0; i < strings.length; i++) {
        String buffer = strings[i];

        if (intMap.containsKey(buffer)) {
            int val = intMap.get(buffer);
            val++;
            intMap.put(buffer, val);
        } else {
            intMap.put(buffer, 1);
        }
        boolMap.put(buffer, intMap.get(buffer) >= 2);

    }

    return boolMap;
}

Open in new window


above passes all. any improvements or alternate aproaches?
0
 
phoffricCommented:
Here's a tiny improvement, IMO:
    for (String buffer:strings) {
//        String buffer = strings[i];

Open in new window

Nice indenting, BTW.
0
 
phoffricCommented:
@zzynx,
In the first half of  your last post #a41827513 you say, "that's a replacement for these TWO lines of code:"

But I demonstrated that in the post before you. Why did you repeat this small point?
0
 
zzynxSoftware engineerCommented:
@phoffric
You told that
for (String buffer:strings) {

Open in new window

is a replacement for
//        String buffer = strings[i];

Open in new window

Which is in correct.

I corrected that. That's why I wrote TWO with capitals.
0
 
phoffricCommented:
Ok. No replacement since a for loop can hardly replace a definition of a variable. Just replacing one for loop with another and then commenting out the duplicate definition of buffer.
0
 
zzynxSoftware engineerCommented:
Just replacing one for loop with another
That wasn't clear to me.

It's always good to use the form
replace
this code

Open in new window

by
that code

Open in new window

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.