johncho316
johncho316

Reputation: 21

Is it more efficient to use arrays or character?

is this the most efficient method to determine that there is a minimum of two unique characters in a String? Should I have used arrays to hold the characters? Thank you

public static Boolean checkPW(String pw) {
    Boolean validLower = false, validUpper = false, validNumber = false;
    char lowerCompare = '0', upperCompare = '0', numberCompare = 'a';

    for(int position = 0; position < pw.length(); ++position) {
        char character = pw.charAt(position);
        if(character >= 'a' && character <= 'z') {
            if(lowerCompare == '0')
                lowerCompare = character;
            else if(lowerCompare != character)
                validLower = true;
        } // lower-case if END
    } // for-loop END
if(validLower)
    return true;
else
    return false;
} // checkPW END

Upvotes: 0

Views: 43

Answers (3)

tgdavies
tgdavies

Reputation: 11411

I'd do this:

public static boolean checkPW(String pw) {
  Character lowerCompare = null;

  for (int position = 0; position < pw.length(); ++position) {
    char character = pw.charAt(position);
    if(Character.isLowerCase(c)) { // this handles non-ASCII lower case characters
        if(lowerCompare == null) {
            lowerCompare = character;
        } else if(lowerCompare != character) {
            return true;
        }
    }
  }
  return false;
}

Upvotes: 0

janos
janos

Reputation: 124646

is this the most efficient method to determine that there is a minimum of two unique characters in a String?

No. The loop continues to run after 2 unique valid characters are found, which is unnecessary. It could stop immediately, and then it will be more efficient. Consider for example the string "ab" followed by a million characters. There's no need to go further than the first two.

Should I have used arrays to hold the characters?

The question is not clear. To make it meaningful, you would need to include reasoning for the benefits of both methods. And it's not clear what technique you're referring to.

It would be good to remove all the unnecessary variables from the program. After fixing the inefficiency, and a bit of cleanup:

public static boolean checkPW(String pw) {
    char first = '0';

    for (int position = 0; position < pw.length(); ++position) {
        char character = pw.charAt(position);
        if ('a' <= character && character <= 'z') {
            if (first == '0') {
                first = character;
            } else if (first != character)
                return true;
            }
        }
    }
    return false;
}

Upvotes: 1

Tim Biegeleisen
Tim Biegeleisen

Reputation: 521093

If I had to do this in Java, in production, I might just use a set here:

String input = "abcdefgzz";
char[] letters = input.toCharArray();
Set<Character> set = new HashSet<>();
boolean valid = false;
for (char letter : letters) {
    set.add(letter);
    if (set.size() > 1) {
        valid = true;
        break;
    }
}

if (valid) {
    System.out.println("Minimum of two unique letters");
}
else {
    System.out.println("Only one unique letter");
}

Upvotes: 1

Related Questions