Поиск предикатов в Java

Вы не хотите печатать каждую строку, вы хотите оценить так, чтобы Bash мог выполнять подстановки переменных.

FOO=42
while read; do
    eval echo "$REPLY"
done < something.txt

См. help eval или Bash руководство для получения дополнительной информации.

11
задан pie154 19 October 2011 в 11:06
поделиться

6 ответов

Встроенной поддержки нет, но Apache Collections и Google Collections обеспечивают поддержку предикатов над коллекциями.

Возможно, вам будет полезен этот вопрос и ответы на него. То же самое касается этой статьи на developer.com.

например, использование коллекций Google:

final Predicate<name> bobRushPredicate = new Predicate<name>() {
   public boolean apply(name n) {
      return "bob".equals(n.getMiddlename()) && "rush".equal(n.getSurname());
   }
}

final List<name> results = Iterables.filter(applicants, bobRushPredicate));
14
ответ дан 3 December 2019 в 08:03
поделиться

Если вам нужно выполнить поиск на основе проверки равенства объектов по сравнению с проверкой массива apache common ArrayUtils , вам в основном придется переопределить ваши равенства и hascode для объекта имени и использовать его, но если вы хотите использовать настраиваемый поиск критерии, я полагаю, вы должны реализовать свой собственный способ, и в нем нет встроенной поддержки языка Java

0
ответ дан 3 December 2019 в 08:03
поделиться

Более быстрый способ, о котором я могу думать, - это создать структуру данных, которая отражает значения свойств этого объекта и содержит внутренний индекс для каждого имеющегося значения.

При поиске значения эта внутренняя структура данных возвращает индекс с использованием двоичного поиска.

Единственное требование - ваш объект должен зарегистрировать и обновить эту структуру.

Что-то вроде следующего воображаемого кода, подобного UML / Python:

 // Holds the index number of a given value
 // for instance, name="Oscar" may be at index 42...
 IndexValuePair
     index : Int
     value : String 

     +_ new( value: String, index: Int ) 
          return IndexValuePair( value, index )

 ValuePairComparator --> Comparator 

     + compareTo( a: IndexValuePair, b: IndexValuePair ) : Int 

         return a.value.compareTo( b.value )

 SearchStructure
     - data = Object[] // The original array which contains your applicants
      // a list of arrays each one containing the property value, and the index on "data" where that value appears 
     - dataIndexes =  List(IndexValuePair)[String] // Map<List<IndexValuePair>> 
     - dataIndexexInitialized = false

     // Add an object to this structure
     + addObject( o: Object ) 
          if( ! dataIndexesInitialized, 
              initIndexesWith( o )
          )

          index = data.add( o ) // returns the index at which "o" was inserted
          addToIndexes( o, index ) 

     // Register all the properties values of the given object 
     // along with the index where they appear in the original array 
     - addToIndexes( object: Object, index: Int ) 
           forEach( property in Object , 
              list = dataIndexes[property]
              list.add( IndexValuePair.new( property.value, index ) ) 
           )
     // Create empty array for each property .. 
     - initIndexesWith( object : Object ) 
          forEach( property in object , 
                comparator = ValuePairComparator()
                list = List<IndexValuePair>()
                list.setComparator(  ) 
                dataIndexes[property] =  list
          )
          dataIndexesInitialized = true 


     // Search an object using the given criteria ( a Map<String, String> = key=value ) 
     + search( criteria: String[String] ) : List<Object>

        result = Set<Object>()

        // let's say criteria has:
        // ["name":"Oscar", "lastName"="Reyes"]
       forEach( key in criteria, 
            list = dataIndexes[key]  // "name", "lastname" ..etc. 
            valuePair = list.binarySearch( criteria[key] ) // first Oscar, later Reyes 
            result.add( data[valuePair.index] )
       ) 

       return result

Ой

Надеюсь, это понятно.

Дело в том, что если вы действительно хотите, чтобы это было действительно быстро, вы должны удерживать индексы по свойству

  1. Массив для данных
  2. Массив для каждого свойства, которое, в свою очередь, будет иметь индекс data

Например, если у вас есть следующий массив:

 a = [ Object(name="Mike", lastName="Z" )
       Object(name="Oscar", lastName="Reyes" ) , 
       Object(name="Rahul", lastName="G" ) , 
       Object(name="Pie", lastName="154" )  ]

У них будут позиции:

0 = Mike ... 
1 = Oscar ...
2 = Rahul ...
3 = Pie ...

И у вас будет два (в данном случае) отдельных массива, которые после сортировки будут:

nameArray =  ["Mike=0", "Oscar=1", "Pie=3", "Rahul=2"]

и

lastNameArray =   ["154=3", "G=2", "Reyes=1", "Z=0"]

Когда вы ищите данный атрибут, вы берете соответствующий массив, например, если вы хотите найти фамилию "Reyes", вы возьмете массив "lastName"

 ["154=3", "G=2", "Reyes=1", "Z=0"]

и выполните на нем двоичный поиск для "Reyes" "который вернет элемент в позиции 2, который, в свою очередь, вернет индекс = 1, который является позицией" Оскара "в исходном массиве.

Это должно хранить данные в O (log n)

0
ответ дан 3 December 2019 в 08:03
поделиться

Посмотрите на класс ParallelArray, он удовлетворяет вашим требованиям, но вам нужно немного изучить концепции функционального программирования, чтобы использовать его эффективно.

Класс не поставляется с JDK 6, но может поставляться с JDK 7 (обсуждается). А пока вы можете использовать его как библиотеку - загрузите пакет JSR166y по адресу: http: //gee.cs.oswego.edu / dl / concurrency-Interest /

См. это руководство для подробного объяснения: http://www.ibm.com/developerworks/java/library/j-jtp03048.html

Это может показаться сложным, и это так (если вы просто копаетесь в высокопроизводительных многопоточных алгоритмах). Существует проект Groovy, который пытается обернуть более удобный API вокруг Parallel Array, так что вы можете также взглянуть на него: http://gpars.codehaus.org/ , http://gpars.codehaus.org/Parallelizer

0
ответ дан 3 December 2019 в 08:03
поделиться

Поиск по массиву и "скорость очень важна" не очень сочетаются. Если только ваш массив не будет очень маленьким, то поиск по массиву никогда не будет быстрым. Это эквивалентно полному сканированию таблицы в базе данных, производительность, независимо от того, как вы это сделаете, будет низкой. Ключом к быстрому поиску является использование индексированной структуры. Вы все еще можете использовать массив, если он вам абсолютно необходим, но поиск должен осуществляться с помощью другой структуры данных. Обратите внимание на коллекции на основе хэша или дерева, поскольку они организуют данные таким образом, чтобы их можно было быстро найти. TreeSet, TreeMap, HashSet, HashMap и т.д. Хэши индексируют данные по хэшированному ключу, деревья похожи, но также хранят данные в отсортированном порядке.

1
ответ дан 3 December 2019 в 08:03
поделиться

Используйте базу данных в памяти, например Apache Derby или hsqldb. Используйте преимущества JDBC, JPA или Hibernate, которые могут делать то, что вы хотите.

Составьте профиль вашего кода. Затем оптимизируйте.

0
ответ дан 3 December 2019 в 08:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: