java - 不使用 Java Matcher 和 Pattern API 删除特殊字符

标签 java arrays string pattern-matching

我正在尝试编写一个java程序。该程序将用户的字符串作为输入,并通过删除其中的特殊字符来显示输出。并在新行中显示每个字符串

假设我有这个字符串 Abc@xyz,2016!horrible_just?kidding 读取此字符串后,我的程序应该通过删除特殊字符(例如

)来显示输出

ABC
xyz
2016年
太可怕了
只是
开玩笑

现在我知道 Java 中已经有可用的 API,例如 MatcherPatterns API 来执行此操作。但我不想使用 API,因为我是 java 初学者,所以我只是想一点一点地破解代码。

这是我到目前为止所尝试过的。我在这里所做的是从用户那里获取字符串并将特殊字符存储在数组中并进行比较直到获得特殊字符。并将新字符存储在 StringBuilder 类中。

这是我的代码

import java.util.*;
class StringTokens{
    public void display(String string){
        StringBuilder stringToken = new StringBuilder();
        stringToken.setLength(0);
        char[] str = {' ','!',',','?','.','_','@'};
        for(int i=0;i<string.length();i++){
            for(int j =0;j<str.length;j++){
                if((int)string.charAt(i)!=(int)str[j]){
                    stringToken.append(str[j]);
                }
                else    {
                    System.out.println(stringToken.toString());
                    stringToken.setLength(0);
                        }
            }
        }
    }
public static void main(String[] args){
    if(args.length!=1)
        System.out.println("Enter only one line string");
    else{
        StringTokens st = new StringTokens();
        st.display(args[0]);
        }       
    }
}

当我运行此代码时,我只获得特殊字符,而没有获得新行中的每个字符串。

最佳答案

一种简单的方法 - 使用集合来保存所有无效字符:

Set<Character> invalidChars = new HashSet<>(Arrays.asList('$', ...));

那么你的支票归结为:

if(invaidChars.contains(string.charAt(i)) {
  ... invalid char  
} else {
  valid char
}

但是,当然,这仍然意味着:您正在重新发明轮子。只有在有充分理由的情况下,人们才会重新发明轮子。一个有效的理由是:您的任务是实现您自己的解决方案。

但除此之外:只需阅读 replaceAll 。该方法的作用与您当前的代码完全相同;我的解决方案就是这样做。但以一种直接的方式;每个优秀的 java 程序员都能够理解!

因此,为了匹配您的问题:是的,您可以自己实现这一点。但下一步是找出问题的“规范”解决方案。当您学习 Java 时,您必须专注于学习如何“像其他人一样”做事,用最少的代码来解决问题。这是 Java 的核心优点之一:对于 99% 的问题,已经有一个直接、高性能、人人都能理解的解决方案;最常见的是直接在 Java 标准库本身中!了解 Java 意味着了解并理解这些解决方案。

每个 C 程序员也可以用 Java 编写 150 行低级数组迭代代码。 真正的美德是知道如何用 5 或 10 行代码完成同样的事情!

关于java - 不使用 Java Matcher 和 Pattern API 删除特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39434336/

相关文章:

java - Android ImageButton 交换资源离开 'residue'

python - 循环中的可调用变量

java - 如何从字符串或 json 对象中搜索并打印特定内容

java - 在 Java 中替换数据的最快方法

java - 如何在 Java 中更改字符串

java - Maven:settings.xml 中的存储库

java - 不兼容类型 : Class<Bar> cannot be converted to Class<CAP#1> where CAP#1 is a fresh-type variable

java - 对象可以继承字符串表示吗?

arrays - Go:如何将 unsafe.Pointer 转换为指向未知长度数组的指针?

arrays - 选择数组中除当前以外的所有内容