我有几个项目的ArrayList。 比方说,它们是:“DARK BROWN”,“蓝”,“绿”,...
有没有什么办法去寻找,如果有在我的一些项目的字符串“暗”? 我知道,不包含这一点,但如果字符串正是它只做。 我的想法是寻找那些开始为我的项目之一的文本,但它不是全部的最后一个字符。
我在吼声像做一个循环:
for(int i=0;i<arraylist.size;i++){
String s = arraylist.get(i);
if (s.startsWith(mytext)){
do something
}
}
但它似乎是一个很慢的方法,因为数组列表可以包含很多元素。 任何更好的想法?
编辑
只是要确保你明白我的意思。 我想知道如果我的ArrayList中的项目包含了一些文字开始,并获得该元素的完整文本的元素。 ArrayList.contains是一个布尔值。 如果我需要检索的信息,我将不得不的IndexOf左右使用,但这个功能让我空,如果我把“棕色”
编辑2
这是你auselen:
数组列表(5000个元素左右):
- “大卫的猫在他的卧室”
- “我喜欢月亮”
- “我想前往火星”
- “我的球是红色的”
- “他们总是忘记Antarctida”
- ...
我想知道是否有一个以“我想要”,然后检索该元素的其余部分开始的元素。
这似乎是一个很慢的方法,因为数组列表可以包含很多元素。
像,一百万?
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"));
}
}
保持字符串的排序(!)阵列和使用binarysearch
找到你的前缀的插入点。 该比赛将是在这一点上,如果在所有。
性能如果这是O(log n)的 ,而不是为O(n),你会发现它要快得多,特别是对于大型数据集。
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);
}
}
无论是做你喜欢做它,或者它变得更加复杂。 有所谓的“线索”的搜索结构,但这是复杂的。
您可以通过在你的第一个字母的排序ArrayList的A-Z ^指向数组起始位置获得了一点。 然后你只需要具有相同字母开头的单词进行搜索。
或者你可以使用完全地不同的方法。 和包裹ArrayList和办理入住手续时list.add()的比赛。 并将其存储在一些变种,以便快速访问。 但是,如果你有多个值进行搜索,那么这种做法是不擅长所有:)。
这里是你可以用获得的每个项目使用功能的例子。 这个速度是不是一个真正的增长。 由于这是一个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.");
}
}