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

时间:2016-09-11 08:44:39

标签: java arrays string pattern-matching

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

假设我在阅读此字符串后有这个字符串Abc@xyz,2016!horrible_just?kidding我的程序应该通过删除特殊字符来显示输出

ABC
XYZ
2016
可怕
只是
开玩笑

现在我知道已有API可用,例如java中的匹配器模式 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]);
        }       
    }
}

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

5 个答案:

答案 0 :(得分:2)

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

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行做同样事情的方法!

答案 1 :(得分:1)

我无法发表评论,因为我不具备所需的声誉。目前你附加str [j]代表特殊字符。相反,你应该附加string.charAt(i)。希望有所帮助。

stringToken.append(str[j]);

应该是

stringToken.append(string.charAt(i));

答案 2 :(得分:1)

以下是您的代码的更正版本,但有更好的解决方案可以解决此问题。

public class StringTokens {

    static String specialChars = new String(new char[]{' ', '!', ',', '?', '.', '_', '@'});

    public static void main(String[] args) {
        if (args.length != 1) {
            System.out.println("Enter only one line string");
        } else {
            display(args[0]);
        }
    }

    public static void display(String string) {
        StringBuilder stringToken = new StringBuilder();
        stringToken.setLength(0);
        for(char c : string.toCharArray()) {
            if(!specialChars.contains(String.valueOf(c))) {
                stringToken.append(c);
            } else {
                stringToken.append('\n');
            }
        }
        System.out.println(stringToken);
    }
}

答案 3 :(得分:0)

public static void main(String[] args) {
    String a=",!?@_."; //Add other special characters too
    String test="Abc@xyz,2016!horrible_just?kidding"; //Make this as user input
    for(char c : test.toCharArray()){
        if(a.contains(c+""))
        {
            System.out.println(); //to avoid printing the special character and to print newline
        }
        else{
            System.out.print(c);
        }
    }
}

答案 4 :(得分:0)

你可以运行一个简单的循环并检查每个字符的ascii值。如果除A-Z和a-z之外的其他内容打印换行符跳过该字符并继续前进。时间复杂度将是O(n)+没有使用额外的类。

        String str = "Abc@xyz,2016!horrible_just?kidding";

        char charArray[] = str.toCharArray();

        boolean flag=true;;
        for (int i = 0; i < charArray.length; i++) {
            int temp2 = (int) charArray[i];

            if (temp2 >= (int) 'A' && temp2 <= (int) 'Z') {
                System.out.print(charArray[i]);
                flag=true;
            } else if (temp2 >= (int) 'a' && temp2 <= (int) 'z') {
                System.out.print(charArray[i]);
                flag=true;
            } else {
                if(flag){
                    System.out.println("");
                    flag=false;
                }
            }
        }