Вывести вхождение символов в массиве в 2D массив - PullRequest
1 голос
/ 25 октября 2019

У меня есть несколько символов в массиве символов из az.

  1. Как мы можем проверить, что символы во входном массиве находятся между az?
  2. Распечатать вхождение каждого символа в двумерном массиве, а также распечатать все символы между az, которых нет ввходной массив с числом вхождений как 0. (Col1 - символ, Col2 - количество вхождений)

Например:

Input - {'c','b','e','x','h'};

Output -

Col1 Col2

a    0

b    1

c    1

d    0

и т. д. до z ...

Я попытался решить 1-ю часть вопроса, как показано ниже:

public static boolean charValidation(char[] arr) {

       char[] charArr=new char[122];

        for(char c : arr)
        {
            int ascii = (int)c;
            charArr[ascii]=c;
        }

        for(int i=0;i<charArr.length;i++) {
            if(i<97 || i>122) {
                if((int)charArr[i]!=0) {
                    return false;
                }
            }
        }
        return true;        
    }

Кажется, это хакерское решение. Любое оптимизированное решение для 1-го и 2-го?

Ответы [ 4 ]

0 голосов
/ 25 октября 2019

На ваши первые вопросы, насколько велик ваш массив? Если размер не является проблемой, я бы использовал regexp для его достижения.

Замените все, что не в az, и если оставшаяся длина строки равна нулю, означает, что все символы от az.

private static boolean validateChar(char[] arr) {
    if (arr == null || arr.length == 0) {
        return false;
    }
    return new String(arr).replaceAll("[!a-z]", "").length() == 0;
}

Что касается вашего второго вопроса, я думаю, что HashMap справится с задачей лучше, чем 2d массив, если у вас нет особых требований, которым действительно нужен 2d массив.

0 голосов
/ 25 октября 2019

Вы можете сделать первую часть только с одной для цикла.

for (int i = 0; i < arr.length; i++)
{
    int ascii = (int) arr[i];

    // if anyone of the ascii codes is outside this range...
    if (ascii < 97 || ascii > 122)
    { 
        // ... then the array has something other than a-z
        // ... so the array is not valid
         return false;
    }
}

// if we made it through the entire for loop,
// this means we never came across an invalid char,
// so return true 

return true;
0 голосов
/ 25 октября 2019

Вы можете выполнить необходимую логику в самом первом цикле следующим образом:

        for(char c : arr)
        {
           int ascii = (int)c;
           if(ascii < 97 || ascii > 122)
           {
               return false; 
           }
           return true;
        }
0 голосов
/ 25 октября 2019

Вот простая реализация, которая заполняет хэш-карту всеми строчными буквами алфавита с их счетчиками, инициализированными в ноль.

public static boolean charValidation(char[] input) {
    boolean valid = true;
    String letters = "abcdefghijklmnopqrstuvwxyz";
    Map<Character, Integer> counts = new HashMap<>();
    for (char letter : letters.toCharArray()) {
        counts.put(letter, 0);
    }
    for (char letter : input) {
        if (letter < 'a' || letter > 'z') {
            valid = false;
        }
        else {
            int count = counts.get(letter);
            counts.put(letter, count+1);
        }
    }

    counts.entrySet().forEach(entry->{
        System.out.println(entry.getKey() + " " + entry.getValue());  
    });

    return valid;
}

public static void main(String args[]) {
    char[] input = {'c','b','e','x','h'};
    System.out.println("All inputs were valid: " + charValidation(input));
}

Это печатает:

a 0
b 1
c 1
d 0
e 1
f 0
g 0
h 1
i 0
j 0
k 0
l 0
m 0
n 0
o 0
p 0
q 0
r 0
s 0
t 0
u 0
v 0
w 0
x 1
y 0
z 0
All inputs were valid: true
...