Java-检查字符串是偶数(FFHHIIJJ,UUURROOOR,..)还是奇数(IIREELO,PPGIUUUUS,..)

时间:2019-06-28 14:56:52

标签: java string java-8

在Java中,我需要检查给定的字符串是偶数还是奇数。

即使一个字符串也将具有相等数量的字符(HHEEPPDIDI,LLLQQMQMM,...) 奇数字符串的字符数不相等(HRTRDFF,HIYUDHDA等)

我尝试计算每个字符的出现次数,然后将该值放入一个INT变量,然后比较INT变量的值。但这看起来不像是有效的代码。

  int frequency = 0;

        for(int i = 0; i < str.length(); i++) {
            if(ch == str.charAt(i)) {
                ++frequency;
            }

像这样,我们可以计算每个字符并比较它们的值。。但是我想知道是否还有其他简单方法,或者我们可以使用任何内置方法来实现它。我们最多可以使用Java 8版本。 任何对此的帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以迭代输入字符串,并将char的{​​{1}}加到计数器增加的数据结构(char)中。

HashMap

输出:

import java.util.HashMap; public class A02 { public static void main(String[] args) { System.out.println(new A02().new Solution().check("HHEEPPDIDI")); System.out.println(new A02().new Solution().check("HHEEPPDID")); System.out.println(new A02().new Solution().check("HRTRDFF")); } class Solution { HashMap<Character,Integer> hm = new HashMap<>(); public String check(String s) { for(int i=0;i<s.length();i++) { if(hm.get(s.charAt(i))==null) { hm.put(s.charAt(i), 1); } else { hm.put(s.charAt(i),hm.get(s.charAt(i))+1); } } int first = 0; for(Character c : hm.keySet()) { if(first==0) first=hm.get(c); if(first !=hm.get(c)) return "odd:"+s; } return "even:"+s; } } }
even:HHEEPPDIDI
odd:HHEEPPDID

关于时间的最佳算法不是必需的,但仍然可能有用。 (可能会基于以下想法进行进一步优化:如果找到两个具有不同计数器的字符,那很奇怪)

Java 8更新

odd:HRTRDFF

用于空输入的输出:

public String check(String s) { //place the string into a map by chars with counter Map<Integer,Long> map = s.chars().boxed().collect(Collectors.groupingBy(t -> t, Collectors.counting())); //check map by value - if values are the same then even and map size=1 int size = map.values().stream().collect(Collectors.groupingBy(t -> t)).keySet().size(); if(size==1 || size==0) return "even:"+s; return "odd:"+s; }

答案 1 :(得分:0)

  

因此在Java 8或更高版本中,是否有任何字符串API方法   将简化要求。

如果愿意,在Java 8及更高版本中,可以使用流API,首先用于构造计数图(在Java 9中从{{1}开始),其次用于确定映射是否包含不同的计数。您是否认为它更简单可能更多取决于口味(我可能会认为它更高级,并且喜欢它)。

您可以搜索网络和Stack Overflow以获取详细信息。如果您遇到困难,请发布新问题,我们将为您提供帮助。

编辑:我认为到目前为止您已经有时间编写自己的代码,因此我将发布我的代码供您比较,如果您愿意的话,而不会浪费您的乐趣和学识

str.chars()

让我们尝试一下:

public static boolean isEven(String s) {
    if (s.isEmpty()) {
        return true;
    }
    Map<Integer, Long> counts = s.chars()
            .boxed()
            .collect(Collectors.groupingBy(ch -> ch, Collectors.counting()));
    Long someCount = counts.values().iterator().next();
    return counts.values()
            .stream()
            .allMatch(someCount::equals);
}

输出为:

    for (String s : new String[] {
            // Even strings
            "FFHHIIJJ", "UUURROOOR", "HHEEPPDIDI", "LLLQQMQMM", "abaccb", "abc", "d", "",
            // Odd strings
            "IIREELO", "PPGIUUUUS", "HRTRDFF", "HIYUDHDA", "abbc", "aabcc" }) {
        System.out.format("%-11s %b%n", s, isEven(s));
    }