为了账号安全,请及时绑定邮箱和手机立即绑定

如何编写java程序只打印字符串中的重复字符?

如何编写java程序只打印字符串中的重复字符?

动漫人物 2023-08-23 14:38:41
我想仅使用集合(Set)打印字符串中的重复字符。我已经编写了代码,但如果字符串是“ashish”,它将显示正确的结果,但如果字符串是“ashish java”,则会显示失败,因为字符“a”出现了三次。public class DuplicateStringMethod {    public static void duplicateString(String str) {        char[] cArray = str.toCharArray();        Set<Character> set = new HashSet<Character>();        for(char c:cArray) {            if(set.add(c)==false) {                System.out.println(c);            }        }    }    public static void main(String[] args) {        duplicateString("Java ashishj ");    }}它将打印a a s h。但我a s h只想使用Set界面。
查看完整描述

4 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

再使用一组来存储重复元素并打印该元素。尝试这样:


public static void duplicateString(String str) {

        str=str.replaceAll(" ","");

        char[] cArray = str.toCharArray();

        Set<Character> set = new HashSet<Character>();

        Set<Character> set1 = new HashSet<Character>();

        for(char c:cArray) {

            if(set.add(c)==false) {

                if(set1.add(c) == true)

                    System.out.println(c);

            }

        }

    }


查看完整回答
反对 回复 2023-08-23
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

我并不完全清楚“仅使用接口”需要什么,Set但我假设这意味着重复的字符将在Set. 有几种方法可以做到这一点。第一个是对输入字符串的字符进行直接循环。它利用了以下功能:如果集合被修改,则Set.add返回;如果没有,则返回;这意味着返回的操作是重复的。truefalseaddfalse


static Set<Character> dups0(String input) {

    Set<Character> dups = new HashSet<>();

    Set<Character> seen = new HashSet<>();

    for (char ch : input.toCharArray()) {

        if (! seen.add(ch)) {

            dups.add(ch);

        }

    }

    return dups;

}

有一种流式的方式可以做到这一点,本质上与流形式表达的东西是一样的:


static Set<Character> dups1(String input) {

     Set<Character> seen = new HashSet<>();

     return input.chars()

                 .mapToObj(ch -> (char)ch)

                 .filter(ch -> !seen.add(ch))

                 .collect(toSet());

}

有些人可能会觉得这令人讨厌,因为它的过滤操作会产生副作用。此外,如果并行运行,结果将需要类似于ConcurrentHashMap.newKeySet.


另一种方法是生成字符频率表并删除仅出现一次的所有条目:


static Set<Character> dups2(String input) {

     Map<Character, Long> map = input.chars()

                                     .mapToObj(i -> (char)i)

                                     .collect(groupingBy(ch -> ch, HashMap::new, counting()));

     map.values().removeIf(v -> v == 1);

     return map.keySet();

}

请注意,这在映射的值集合视图上使用集合批量突变操作。为了确保映射是可变的,我使用了三参数重载groupingBy来指定映射的实现类型。


如果你不喜欢突变,有一个纯流的方法可以做到这一点:


static Set<Character> dups3(String input) {

    Map<Character, Long> map = input.chars()

                                    .mapToObj(i -> (char)i)

                                    .collect(groupingBy(ch -> ch, counting()));

    return map.entrySet().stream()

              .filter(entry -> entry.getValue() > 1)

              .map(Map.Entry::getKey)

              .collect(toSet());

}


查看完整回答
反对 回复 2023-08-23
?
隔江千里

TA贡献1906条经验 获得超10个赞

尝试一下:


public static void duplicateString(String str) {

    Set<Character> firstTime = new HashSet<Character>();

    Set<Character> reported = new HashSet<Character>();


    char[] cArray = str.toCharArray();

    for(char c:cArray) {

        if (!firstTime.contains(c)) {

          firstTime.add(c);

          continue;

        }

        if (reported.contains(c)) { continue; }

        reported.add(c);

        System.out.println(c);

    }

}

我进行了一些测试:


添加:10000000 次操作需要 52443260ns

包含:10000000 次操作需要 28209745ns

因此上面的代码虽然不短但速度最快。


查看完整回答
反对 回复 2023-08-23
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

检查这个程序


public static void duplicateString(String str) {


        char[] cArray = str.replaceAll("\\s+", "").toCharArray();


        Set<Character> set = new HashSet<Character>();

        Set<Character> alreadyExistingSet = new HashSet<Character>();


        for (char c : cArray) {

            if (set.add(c) == false && alreadyExistingSet.add(c) == true) {

                System.out.print(c);

            }

        }

    }


查看完整回答
反对 回复 2023-08-23
  • 4 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信