字符串解析和比较

时间:2016-06-10 12:58:20

标签: java arrays string

我已经创建了一个接受两个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方面的一些经验并没有带我到解决方案。

2 个答案:

答案 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]

请注意,这不是一个完整的解决方案,而是为了帮助您入门。您至少需要添加非字母字符的处理。

答案 1 :(得分:0)

             <PRICECHECK> 
                   <RATEID>rate1</RATEID> 
                   <ORIGINCOUNTRY>AU</ORIGINCOUNTRY> 
                   <ORIGINTOWNNAME>Atherstone</ORIGINTOWNNAME> 
                   <ORIGINPOSTCODE>CV9 2RY</ORIGINPOSTCODE> 
                   <ORIGINTOWNGROUP/> 
                   <DESTCOUNTRY>ES</DESTCOUNTRY> 
                   <DESTTOWNNAME>Alicante</DESTTOWNNAME> 
                   <DESTPOSTCODE>03006</DESTPOSTCODE> 
                   <DESTTOWNGROUP/> 
                   <CONTYPE>N</CONTYPE> 
                   <CURRENCY>AUD</CURRENCY> 
                   <WEIGHT>0.2</WEIGHT> 
                   <VOLUME>0.1</VOLUME> 
                   <ACCOUNT/> 
                   <ITEMS>1</ITEMS> 
             </PRICECHECK>