有没有办法知道如果一个ArrayList包含一段文字?(Is there any way to kn

2019-07-04 06:43发布

我有几个项目的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”
  • ...

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

Answer 1:

这似乎是一个很慢的方法,因为数组列表可以包含很多元素。

像,一百万?

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"));
    } 
}


Answer 2:

保持字符串的排序(!)阵列和使用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);

    }

}


Answer 3:

无论是做你喜欢做它,或者它变得更加复杂。 有所谓的“线索”的搜索结构,但这是复杂的。

您可以通过在你的第一个字母的排序ArrayList的A-Z ^指向数组起始位置获得了一点。 然后你只需要具有相同字母开头的单词进行搜索。



Answer 4:

或者你可以使用完全地不同的方法。 和包裹ArrayList和办理入住手续时list.add()的比赛。 并将其存储在一些变种,以便快速访问。 但是,如果你有多个值进行搜索,那么这种做法是不擅长所有:)。



Answer 5:

这里是你可以用获得的每个项目使用功能的例子。 这个速度是不是一个真正的增长。 由于这是一个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.");
  }
}


文章来源: Is there any way to know if an arraylist contains a piece of text?