有没有办法知道arraylist是否包含一段文字?

我有一个有几个项目的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元左右):

  • “大卫的猫在他的卧室里”
  • “我喜欢月亮”
  • “我想去火星旅行”
  • “我的球是红色的”
  • “他们总是忘记Antarctida”

我想知道是否有一个元素以“我想要”开头,然后检索元素的其余部分。

它似乎是一种非常慢的方法,因为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 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 list = new ArrayList(); 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); } } 

要么像你做的那样,要么变得更复杂。 有一个名为“trie”的搜索结构,但这很复杂。

你可以通过让a-z数组指向第一个字母的排序ArrayList中的起始位置来获得一点。 然后你只需要搜索以相同字母开头的单词。

或者你可以使用完全不同的方法。 并包装ArrayList并检查list.add()是否匹配。 并将其存储在一些var中以便快速访问。 但是如果你有多个值要搜索,那么这种方法根本就不好:)。

以下是获取每个项目时可以使用的函数示例。 这种速度并没有真正提高。 由于这是一个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."); } }