1

我有一个很大的疑问。我想在这里找到一个不重复的字符串的第一个字符。例如,下面的输入应该返回'c'。所以这就是我打算这样做的方式。但我注意到 remove 方法希望在索引 98 处删除而不是删除对象“a”。如何强制它删除对象“a”而不是从索引中删除?

为什么这不起作用?

我能做些什么来改变这一点?

ArrayList 是否总是保证按顺序存储东西?

public void findStartingLetter()
{
        String[] array={"a","b","c","d","b","a","d","d","d"};

        List<Character> list = new ArrayList<Character>();



        for(String i:array)
        {
            if(list.contains(i.charAt(0)))
                list.remove(i.charAt(0));
            else
                list.add(i.charAt(0));

        }

    }

编辑:

性能方面,这是一个 O(n) 函数吗?

4

4 回答 4

6

您必须手动转换为 a ,Character因为将char转换为 a int,而后者又按索引而不是值。

list.remove((Character) i.charAt(0));

将确保正确完成。

于 2013-06-19T00:47:37.380 回答
2

ArrayList 是否总是保证按顺序存储东西?

取决于您对订单的定义:如果您的意思是添加它们的订单,是的。如果您的意思是数字/字母顺序,则否,但您可以使用

Collections.sort(list)

这将按列表中对象的自然升序排序。

于 2013-06-19T00:45:19.497 回答
1

我不完全确定您为什么要为此使用 a List,但我会推荐 a Set- 它保证不包含重复项。

这是第一种方法,带有一组:

public Set<Character> addToSet(String[] elements) {
    Set<Character> res = new HashSet<>();
    for(String c : elements) {
        res.add(c.charAt(0));
    }
    return res;
}

现在,如果你真的想用 a 来做这件事List,那么它是类似的代码——你只需要在添加之前检查元素是否存在。

public List<Character> addUnique(String[] elements) {
    List<Character> res = new ArrayList<>();
    for(String item : elements) {
        Character c = item.charAt(0);
        if(!res.contains(c)) {
            res.add(c);
        }
    }
    return res;
}
于 2013-06-19T01:08:38.380 回答
0

你解决这个问题的方法很混乱,你问了很多似乎与你的问题无关的问题。

为什么不直接使用:

String testString = "abcdbaddd";
Character retVal = null;
for (int i = 0; i < testString.length() -1; i++) {
    if (testString.charAt(i) == testString.charAt(i + 1)) {
        retVal = testString.charAt(i);
        break;
    }
}
return retVal;

如果不存在这样的字符,这将获得第一个非重复字符(我假设重复是指重复和相邻)或 null。

于 2013-06-19T00:46:37.760 回答