On 2012 Feb 1, at 3:07 AM, Thomas Koch wrote:
> OK, I found a solution (obviously not the best one...): lucene.Set is
> representing a java.util *interface* Set<E> which of course cannot be
> instantiated. HashSet is an implementing class, and can be instantiated. You
> can add elements via the add() method to the set then. Example:
>
> def get_lucene_set(python_list):
> """convert python list into lucene.Set (Java.util.set interface)
> using the HashSet class (java.util) wrapped in lucene.HashSet
> """
> hs = lucene.HashSet()
> for el in python_list:
> hs.add(el)
> return hs
>
> However I'm still looking for a more elegant constructor that would allow to
> create a HashSet from a python set (or list). Is that available/possible?
Arrays.asList converts java arrays to java lists, and you can pass a python
sequence to it. From there, all of the collection constructors can be passed
other collections.
>>> lucene.Arrays.asList('abc')
<List: [a, b, c]>
>>> lucene.HashSet(lucene.Arrays.asList('abc'))
<HashSet: [b, c, a]>
> The same holds for lists like the ArrayList (from java.util too) which
> implements the Collection interface:
>
> Example:
>>>> l =range(3)
>>>> l
> [0, 1, 2]
>>>> a = lucene.ArrayList(l)
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> lucene.InvalidArgsError: (<type 'ArrayList'>, '__init__', ([0, 1, 2],))
>
> using the for-in-do obj.add "trick" allows to generate a 'filled' instance
> here as well : <ArrayList: [0, 1, 2]>
> but wouldn't it be nice to be able to create an instance more "pythonic"?
>
> I'm not a Java expert (nor do I know much about the Collections API), so
> maybe it's even impossible in Java to create an instance of a
> List,Vector,HashSet (whatever) and passing some literals (like Strings) -
> who knows... So if anyone has a better idea how to do this in PyLucene
> please let me know ,-)
>
> regards,
> Thomas
>
>