2016-06-10 3 views
0

Я создал функцию, которая принимает два объекта String. Метод возвращает массив символов, содержащий один элемент для каждого вхождения алфавитного символа, который появляется только в двух строках. Любые неалфавитные символы в любой строке игнорируются.Анализ строк и сравнение

public static void main(String[] args) { 
    System.out.println(alphabetize("ABc","abC")); 
} 

static String alphabetize(String one, String two) {   
    String result = one + two; 
    String expression = "^[a-zA-Z]*$"; 
    CharSequence inputStr = result; 
    Pattern pattern = Pattern.compile(expression); 
    Matcher matcher = pattern.matcher(inputStr); 
    if(matcher.matches()) { 
     char[] chars = result.toCharArray(); 
     Set<Character> charSet = new LinkedHashSet<Character>(); 
     for (char c : chars) { 
      charSet.add(c); 
     } 
     StringBuilder sb = new StringBuilder(); 
     for (Character character : charSet) { 
      sb.append(character); 
     } 
     return (sb.toString());  
    } else { 
     return null; 
    }  
} 

Прежде всего, как я могу отсортировать массив в пути, возвращающее значение становится в алфавитном порядке, со всеми прописными буквами, появляющихся перед любой строчной буквой. Кроме того, дело имеет значение и должно приниматься во внимание. Например, если для строк «aBA» и «abA» функция должна возвращать массив, состоящий из {'B', 'b'}, потому что во второй строке нет прописной буквы B, и в строке нет буквы «b» первая строка. Кроме того, несколько случаев являются релевантными и должны приниматься во внимание. Например, если для строк «aba» и «ba» функция должна возвращать массив, состоящий из {'a'}, потому что символ «a» появляется во второй строке только один раз.

Пример:

enter image description here

Можно ли вести меня по решению проблемы? моя горстка опыта в java не несет меня к решению.

+0

Если результирующий массив состоит из { 'A', 'а', 'B', 'б'}, вы хотите сортируется таким образом, или Вы хотите { 'A', 'B', 'а', 'б'}? – Zircon

+1

Пожалуйста, приложите усилия к форматированию вашего кода - сейчас он повсюду. –

+0

@JonSkeet Извините, Джон, разве он уже отформатирован? –

ответ

0
public static void main(String[] args) 
{ 
    HashMap<Character, Integer> store = new HashMap<Character, Integer>(); 
    arrangeFrequency("ababaABABR", store); 
    arrangeFrequency("ababp", store); 

    Object[] output =store.keySet().toArray(); 
    Arrays.sort(output); 
    System.out.println(Arrays.toString(output)); 
} 

private static void arrangeFrequency(String str, HashMap<Character, Integer> s1) 
{ 
    int defaultVal = (s1.isEmpty()) ? 1: -1; 
    for(int i=0; i<str.length();i++) 
    { 
     char c = str.charAt(i); 
     if(Character.isLetter(c)) 
     { 
      int val = s1.containsKey(c) ? (s1.get(c).intValue()+defaultVal) : 1; 
      if(val>0) 
       s1.put(c, val); 
      else 
       s1.remove(c); 
     } 
    } 
} 
+0

Большое спасибо –

+0

Предупреждение: у него есть ошибка. исправить его перед отправкой на производство. Подсказка: укажите ввод как «aa» и «aaaa». – Azodious

+0

Да, осознал это и уже разобрался. Спасибо. –

0

Пробуйте использовать Map<Character, Integer> для подсчета символов первой строки. Затем перебираем символы второй строки, и если вы находите ее на карте, уменьшите счет на 1. Если счетчик достигнет 0, удалите символ с карты, если вы не найдете символ на карте, соберите его в (или установите, если вы не хотите дублировать). В конце собрать все символы, оставшиеся на карте, в список, добавив его столько раз, сколько указывает значение карты. Наконец, отсортируйте список в соответствии с вашими потребностями.

Пример:

String s1 = "xyyzaBC"; 
String s2 = "zyxBcA"; 

Map<Character, Integer> charCounts = new HashMap<>(); 

//Collect chars in s1 
for(char c: s1.toCharArray()) { 
    Integer count = charCounts.get(c); 
    if(count == null) { 
    count = 0; 
    } 
    count++; 
    charCounts.put(c, count); 
} 

//Check chars in s2 
List<Character> nonMatchingChars = new LinkedList<>(); 
for(char c: s2.toCharArray()) { 
    Integer count = charCounts.get(c); 

    if(count == null) { 
    //character not found 
    nonMatchingChars.add(c); 
    } else { 
    count--; 
    if(count <= 0) { 
     //count reduced to 0, remove now 
     charCounts.remove(c); 
    } else { 
     charCounts.put(c, count); 
    } 
    }   
} 

//Add chars still in the map 
for(Map.Entry<Character, Integer> e : charCounts.entrySet()) { 
    for(int i = 0; i < e.getValue(); i++) { 
    nonMatchingChars.add(e.getKey()); 
    } 
} 

//Sort 
Collections.sort(nonMatchingChars); 

System.out.println(nonMatchingChars); 

Выход: [A, C, a, c, y]

Обратите внимание, что это не означает, что полное решение, но, чтобы вы начали. Вам нужно будет добавить обработку не-альфа-символов, по крайней мере.

+0

Большое спасибо –

Смежные вопросы