我正在尝试将字符串与字符串数组进行比较,并将字符串添加到数组中(如果数组已经不在数组中)。
我试过
String [] array =new String [100];
for (int i=0; i<counter; i++){
if(!str.equals(arry[i])){
array[i]=str;
counter++;
}
}
它似乎不起作用。
如果array = (mike, john, tom, bob);
那么基本
并且新字符串是tony
,它应该将tony
与数组进行比较并将其添加到数组中。但是如果下一个字符串是mike
,则不要将它添加到数组中,因为它已经在列表中。
答案 0 :(得分:3)
在Java中无法更改数组的大小。您应该使用List
,或者如果订单无关紧要,则使用Set
:
List<String> lst = new ArrayList<String>(Arrays.asList(arry));
if (! lst.contains(str)) lst.add(str);
答案 1 :(得分:3)
数组具有固定大小,因此向数组添加元素并不容易。您想要的行为正是java.util.Set
的行为。学习如何使用标准集合:它们比数组更强大。如果要保留元素的顺序,请使用LinkedHashSet。见http://download.oracle.com/javase/tutorial/collections/。
现在,为什么你的代码会失败?
您正在遍历数组,一旦找到一个不等于字符串的元素,就用字符串替换它。而且你也可以在不考虑数组长度的情况下进行迭代。这是您可能需要的代码:
boolean found = false;
for (String element : array) {
if (str.equals(element)) {
found = true;
break;
}
}
if (!found) {
// add str to array, but where? Use a Set instead.
}
答案 2 :(得分:2)
如果可以的话,避免使用数组,Java的Collections Framework就不那么麻烦了:
将您的所有姓名保留在HashSet<String>
(如果订单很重要,请使用LinkedHashSet
,如JB Nizet在评论中所述)并add()
每个你遇到的“下一个名字” - 集合语义将保持所有元素的独特性,甚至可以根据需要增长,无需创建新数组并复制自己周围的事物。
Set<String> names = new HashSet<String>();
names.add("mike");
names.add("john");
names.add("tom");
names.add("bob");
assert names.size() == 4;
names.add("bob");
assert names.size() == 4; // still, because "bob" was already in the set
names.add("tony");
assert names.size() == 5; // "tony" is a new unique value, so the set grows
答案 3 :(得分:0)
您应该使用Set来解决此问题。集合是一种数据结构,不能包含重复元素,非常适合您的问题。
Set<String> names = new LinkedHashSet<String>();
Collections.addAll(names, "Mike", "John", "Tom", "Bob");
names.add("Tony");
System.out.println(names); // Tony gets added to the end of the Set
names.add("Mike");
System.out.println(names); // Set already contains Mike, don't add another
输出
[Mike, John, Tom, Bob, Tony]
[Mike, John, Tom, Bob, Tony]
答案 4 :(得分:0)