Вы не хотите печатать каждую строку, вы хотите оценить так, чтобы Bash мог выполнять подстановки переменных.
FOO=42
while read; do
eval echo "$REPLY"
done < something.txt
См. help eval
или Bash руководство для получения дополнительной информации.
Встроенной поддержки нет, но 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));
Если вам нужно выполнить поиск на основе проверки равенства объектов по сравнению с проверкой массива apache common ArrayUtils
, вам в основном придется переопределить ваши равенства и hascode для объекта имени и использовать его, но если вы хотите использовать настраиваемый поиск критерии, я полагаю, вы должны реализовать свой собственный способ, и в нем нет встроенной поддержки языка Java
Более быстрый способ, о котором я могу думать, - это создать структуру данных, которая отражает значения свойств этого объекта и содержит внутренний индекс для каждого имеющегося значения.
При поиске значения эта внутренняя структура данных возвращает индекс с использованием двоичного поиска.
Единственное требование - ваш объект должен зарегистрировать и обновить эту структуру.
Что-то вроде следующего воображаемого кода, подобного 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
Ой
Надеюсь, это понятно.
Дело в том, что если вы действительно хотите, чтобы это было действительно быстро, вы должны удерживать индексы по свойству
Например, если у вас есть следующий массив:
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)
Посмотрите на класс 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
Поиск по массиву и "скорость очень важна" не очень сочетаются. Если только ваш массив не будет очень маленьким, то поиск по массиву никогда не будет быстрым. Это эквивалентно полному сканированию таблицы в базе данных, производительность, независимо от того, как вы это сделаете, будет низкой. Ключом к быстрому поиску является использование индексированной структуры. Вы все еще можете использовать массив, если он вам абсолютно необходим, но поиск должен осуществляться с помощью другой структуры данных. Обратите внимание на коллекции на основе хэша или дерева, поскольку они организуют данные таким образом, чтобы их можно было быстро найти. TreeSet, TreeMap, HashSet, HashMap и т.д. Хэши индексируют данные по хэшированному ключу, деревья похожи, но также хранят данные в отсортированном порядке.
Используйте базу данных в памяти, например Apache Derby или hsqldb. Используйте преимущества JDBC, JPA или Hibernate, которые могут делать то, что вы хотите.
Составьте профиль вашего кода. Затем оптимизируйте.