【发布时间】:2012-12-11 09:40:29
【问题描述】:
我正在使用此代码来获取数组中字符串的索引。
int n = Arrays.asList(Names).indexOf(textBox.getText());
这里的问题是,如果 textBox 中的字符串在 case 中与它在数组中的相似字符串不同。它返回 -1。在字符串比较的情况下,如何使其类似于 equalsIgnoreCase。
谢谢
【问题讨论】:
我正在使用此代码来获取数组中字符串的索引。
int n = Arrays.asList(Names).indexOf(textBox.getText());
这里的问题是,如果 textBox 中的字符串在 case 中与它在数组中的相似字符串不同。它返回 -1。在字符串比较的情况下,如何使其类似于 equalsIgnoreCase。
谢谢
【问题讨论】:
您可以使用 Collator 类。在这里您可以设置不同的级别进行比较。 您可以忽略大小写,并设置一些特定的语言字符。例如在德语中,它可以设置 ß 等于 ss。
这里有一些纪录片: Collator class
编辑:这是给你的示例代码
private int indexOf(String[] original, String search) {
Collator collator = Collator.getInstance();
collator.setStrength(Collator.SECONDARY);
for(int i = 0;i<original.length;++i) {
if(collator.equals(search, original[i]))
return i;
}
return -1;
}
【讨论】:
您可以使用StringUtils Apache 公共库类或this 如果您不想下载该库,请查看source code 的逻辑来创建方法。使用 StringUtils 的stackoverflow 链接
如果你想从字符串数组中找到字符串的索引,那么还有另一个库ArrayUtils,它有一个方法indexOf
这里是 indexOf 的实现
public static int indexOf(Object[] array, Object objectToFind, int startIndex) {
if (array == null) {
return INDEX_NOT_FOUND;
}
if (startIndex < 0) {
startIndex = 0;
}
if (objectToFind == null) {
for (int i = startIndex; i < array.length; i++) {
if (array[i] == null) {
return i;
}
}
} else {
for (int i = startIndex; i < array.length; i++) {
if (objectToFind.equals(array[i])) {
return i;
}
}
}
return INDEX_NOT_FOUND;
}
因为你可以看到它使用 .equals() 我建议你
1) 创建自定义字符串类
2) 将其添加到数组中
3) 像这样覆盖 .equals 方法
class StringCustom
{
String string;
//implement getters and setters
public String equals(Object o)
{
return this.getString().equalsIgnoreCase(((String)o).getString());
}
}
【讨论】:
另一种方法,在内部确保忽略大小写。
public static int indexOfIgnoreCase(String[] strs, String text){
int n = strs.length;
for(int i=0;i<n;i++){
if(strs[i].equalsIgnoreCase(text))
return i;
}
return -1;
}
int n = indexOfIgnoreCase(Names,textBox.getText());
【讨论】:
你可以这样扩展ArrayList
public class StringArrayList extends ArrayList<String> {
@Override
public boolean contains(Object o) {
String paramStr = (String)o;
for (String s : this) {
if (paramStr.equalsIgnoreCase(s)) return true;
}
return false;
}
public int indexOf(Object o) {
String paramStr = (String)o;
int index = 0;
for (String s : this) {
if (paramStr.equalsIgnoreCase(s)) return index;
index++;
}
return -1;
}
}
最终:
int n = new StringArrayList(Arrays.asList(Names)).indexOf(textBox.getText());
【讨论】: