我有一个带有几个项目的arraylist。让我们说它们是:“深褐色”,“蓝色”,“绿色”,......
有没有办法查找我的某些项目中是否有字符串“DARK”?我知道包含这样做,但只有字符串完全正确。我的想法是寻找一个以我的项目之一开头但不包含所有最后一个字符的文本。
我想做一个循环:
for(int i=0;i<arraylist.size;i++){
String s = arraylist.get(i);
if (s.startsWith(mytext)){
do something
}
}
但它似乎是一种非常慢的方法,因为arraylist可以包含很多元素。有更好的想法吗?
修改
只是为了确保你理解我的观点。我想知道我的arraylist的一个项是否包含一个以某些文本开头并获取该元素的完整文本的元素。 ArrayList.contains是一个布尔值。如果我需要检索信息,我将不得不使用IndexOf左右,但如果我把“棕色”这个函数给我null
编辑2
这是给你的auselen:
Arraylist(5000元左右):
我想知道是否有一个元素以“我想要”开头,然后检索元素的其余部分。
答案 0 :(得分:2)
它似乎是一种非常慢的方法,因为arraylist可以包含很多元素。
就像,一百万?
Nov 30, 2012 10:05:20 AM test.t100.t001.ArrayListSpeed main
INFO: Creating entries.
Nov 30, 2012 10:05:21 AM test.t100.t001.ArrayListSpeed main
INFO: Searching..
Nov 30, 2012 10:05:21 AM test.t100.t001.ArrayListSpeed main
INFO: Searching 'dark' 333716
Nov 30, 2012 10:05:21 AM test.t100.t001.ArrayListSpeed main
INFO: Searching 'light' 333333
Nov 30, 2012 10:05:22 AM test.t100.t001.ArrayListSpeed main
INFO: Searching 'plain' 332951
package test.t100.t001;
import java.util.ArrayList;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ArrayListSpeed {
public static String[] PREFIX = {"Dark ", "Light ", "Plain "};
public static String[] COLOR = {"Red", "Green", "Blue"};
public static String getColor(Random r) {
int val = r.nextInt(COLOR.length);
return COLOR[val];
}
public static String getPrefix(Random r) {
int val = r.nextInt(PREFIX.length);
return PREFIX[val];
}
public static int countPrefixes(ArrayList<String> list, String prefix) {
int count = 0;
for (String val : list) {
if (val.toLowerCase().startsWith(prefix.toLowerCase())) {
count++;
}
}
return count;
}
public static void main(String[] args) {
Logger logger = Logger.getAnonymousLogger();
ArrayList<String> list = new ArrayList<String>();
Random r = new Random();
logger.log(Level.INFO, "Creating entries.");
for (int ii=0; ii<1000000; ii++) {
list.add( getPrefix(r) + getColor(r) );
}
logger.log(Level.INFO, "Searching..");
logger.log(Level.INFO,
"Searching 'dark' " + countPrefixes(list,"dark"));
logger.log(Level.INFO,
"Searching 'light' " + countPrefixes(list,"light"));
logger.log(Level.INFO,
"Searching 'plain' " + countPrefixes(list,"plain"));
}
}
答案 1 :(得分:2)
将字符串保存在已排序的(!)数组中,并使用binarysearch
查找前缀的插入点。如果有的话,比赛将在那时进行。
如果这是 O(log n)而非 O(n)的性能,您会发现它更快,特别是对于大型数据集。< / p>
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.junit.Test;
public class ContainsPrefix {
public static String findWithPrefix(String[] data, String prefix) {
int n = Arrays.binarySearch(data, prefix);
if (n < 0) n = -1 - n;
// Loop here if you want to find all matches ...
if (!data[n].startsWith(prefix)) return null;
return data[n];
}
@Test
public void shouldFindStringWithPrefix() {
String[] data = { //
"David's cat is in his bedroom", //
"I like the moon", //
"I want to travel to Mars", //
"My ball is red", //
"They always forget about Antarctida", //
"..." //
};
Arrays.sort(data);
String found = findWithPrefix(data, "I want to");
assertEquals("I want to travel to Mars", found);
}
}
答案 2 :(得分:1)
要么就像你做的那样,要么变得更复杂。 有一个名为“trie”的搜索结构,但这很复杂。
你可以通过让a-z数组指向第一个字母的排序ArrayList中的起始位置来获得一点。然后你只需要搜索以相同字母开头的单词。
答案 3 :(得分:-1)
或者你可以使用完全不同的方法。并包装ArrayList并检查list.add()是否匹配。并将其存储在一些var中以便快速访问。但是如果你有多个值要搜索,那么这种方法根本就不好:)。
答案 4 :(得分:-3)
以下是获取每个项目时可以使用的功能示例。速度并没有真正提高。由于这是一个arraylist,所以没有一个很好的方法来做到这一点。有更好的数据结构可用于搜索字符串的各个部分。
public class RegionMatchesDemo {
public static void main(String[] args) {
String searchMe = "Green Eggs and Ham";
String findMe = "Eggs";
int searchMeLength = searchMe.length();
int findMeLength = findMe.length();
boolean foundIt = false;
for (int i = 0;
i <= (searchMeLength - findMeLength);
i++) {
if (searchMe.regionMatches(i, findMe, 0, findMeLength)) {
foundIt = true;
System.out.println(searchMe.substring(i, i + findMeLength));
break;
}
}
if (!foundIt)
System.out.println("No match found.");
}
}