找一个char优化

时间:2012-02-11 16:32:13

标签: java recursion

因此,这部分作业要我们采用一组字符串,我们将返回一个字符串列表。在字符串集中,我们将有电子邮件地址,即myname@uark.edu。我们要提取电子邮件地址的第一部分;名称并将其放在String List中。从上面的示例中,myname将被放入List中。 我目前使用的代码使用迭代器从Set中提取字符串。然后我使用String.contains(“@”)作为错误检查,以确保String中有一个@符号。然后我从字符串的末尾开始并使用string.charAt(“@”)来检查每个字符。一旦找到它,然后用正确的部分创建一个子串并将其发送到列表。 我的问题是我想使用递归的东西并减少操作。我想的是会分割string.length()/ 2然后在后半部分首先使用String.contains(“@”)的东西。如果那一半确实包含@符号,那么它将以递归方式调用函数agin。如果后半部分不包含@符号,那么前半部分将拥有它,我们将以递归方式调用该函数。

所以我的问题是,当我以递归方式调用函数并将其发送给“substring”时,一旦找到@符号,我将只有子字符串的索引,而不是原始字符串的索引。关于如何跟踪它的任何想法,或者我应该关注的命令/方法。以下是我的原始代码。欢迎任何建议。

public static List<String> parseEmail(Set<String> emails)
    {
        List<String> _names = new LinkedList<String>(); 
        Iterator<String> eMailIt=emails.iterator();

        while(eMailIt.hasNext())
        {
            String address=new String(eMailIt.next());
            boolean check=true;
            if(address.contains("@"))//if else will catch addresses that do not contain '@' .
            {
                String _address="";
                for(int i=address.length(); i>0 && check; i--)
                {
                if('@'==address.charAt(i-1))    
                {
                    _address=new String(address.substring(0,i-1));
                    check=false;
                }
                }
                _names.add(_address);
                //System.out.println(_address);//fill in with correct sub string
            }
            else
            {
                //System.out.println("Invalid address");
                _names.add("Invalid address");//This is whats shownn when you have an address that does not have an @ in it. 
            }                               // could have it insert some other char i.e. *%# s.t. if you use the returned list it can skip over invalid emails
        }
        return _names;
    }

**有人建议我根据API使用String.indexOf(“@”)BUT这个方法只返回第一次出现的符号,我必须假设可能存在多个“@” “在地址中,我必须使用最后一个。谢谢你的建议。我正在查看其他建议,并将报告回来。

***所以有一个string.lastindexOf(),这就是我需要的。

public static List<String> parseEmail(Set<String> emails)
    {
        List<String> _names = new LinkedList<String>(); 
        Iterator<String> eMailIt=emails.iterator();

        while(eMailIt.hasNext())
        {
            String address=new String(eMailIt.next());
            if(address.contains("@"))//if else will catch addresses that do not contain '@' .
            {
                int endex=address.lastIndexOf('@');
                _names.add(address.substring(0,endex-1));
//              System.out.println(address.substring(0,endex));
            }
            else
            {
//              System.out.println("Invalid address");
                _names.add("Invalid address");//This is whats shownn when you have an address that does not have an @ in it. 
            }                               // could have it insert some other char i.e. *%# s.t. if you use the returned list it can skip over invalid emails
        }
        return _names;
    }

3 个答案:

答案 0 :(得分:2)

不要重新发明轮子(除非你当然也被问到)。 Java已经为您尝试String.indexOf(String str)的内容提供了内置函数。使用它。

final String email = "someone@example.com";
final int atIndex = email.lastIndexOf("@");
if(atIndex != -1) {
    final String name = email.substring(0, atIndex);
}

答案 1 :(得分:1)

我同意前两个答案,如果您被允许使用内置函数splitindexOf,那么您应该这样做。但是,如果您自己找到子字符串是您家庭作业的一部分,那么当您找到@又名线性搜索时,您绝对应该浏览字符串的字符并停止。

在任何情况下都不应该尝试递归地执行此操作:在没有任何好处的情况下,不应滥用分而治之的思想:递归意味着函数调用开销并且递归执行此操作只会有一个如果并行搜索子字符串,则比单纯线性搜索更快的机会;即便如此:同步开销会扼杀所有除了最巨大的字符串之外的所有速度。

答案 2 :(得分:0)

除非在作业中指定递归,否则最好通过查看String.split来获得。它会将String拆分为String数组(如果您将其指定为'@'左右),并且可以访问电子邮件地址的两半。