Preciso tirar um String[]
a Set<String>
, mas não sei como fazê-lo. O seguinte falha:
Map<String, ?> myMap = gpxlist.getAll();
Set<String> myset = myMap.keySet();
String[] GPXFILES1 = (String[]) myset.toArray(); // Here it fails.
Como posso corrigi-lo para que funcione?
toArray()
método que é claramente mencionado no Javadoc.toArray()
método padrão stackoverflow.com/a/32179686/1216775Respostas:
Use o
Set#toArray(T[])
método usando um argumento de matriz digitada do mesmo tamanho.Um tamanho diferente também pode ser usado, mas isso forçaria o
toArray()
método a criar uma nova matriz para retornar em vez de reutilizar o argumento fornecido, que pode acabar sendo menos eficiente.Veja também o código fonte de
AbstractCollection#toArray()
.fonte
String[] GPXFILES1 = myset.toArray(new String[0]);
String[] GPXFILES1 = myset.toArray(new String[0])
e isso é recomendado. Atualize a resposta. "Desde as atualizações tardias do OpenJDK 6, essa chamada foi intrinsecificada, tornando o desempenho da versão do array vazio o mesmo e, às vezes, ainda melhor, comparado à versão pré-dimensionada. Também passar a matriz pré-dimensionada é perigoso para uma coleção simultânea ou sincronizada, pois é possível uma corrida de dados entre o tamanho e a chamada toArray, o que pode resultar em nulos extras no final da matriz, se a coleção tiver sido reduzida simultaneamente durante a operação ". - citado pela comunidade java.Java 11
O novo
toArray
método padrão naCollection
interface permite que os elementos da coleção sejam transferidos para uma matriz recém-criada do tipo de tempo de execução desejado. Ele tomaIntFunction<T[]> generator
como argumento e pode ser usado como:Já existe um método semelhante
Collection.toArray(T[])
e essa adição significa que não podemos mais passarnull
como argumento porque, nesse caso, a referência ao método seria ambígua. Mas ainda está tudo bem, pois os dois métodos lançam um NPE de qualquer maneira.Java 8
No Java 8, podemos usar a API de fluxos:
Também podemos usar a versão sobrecarregada do toArray (), que assume
IntFunction<A[]> generator
como:O objetivo da função do gerador aqui é pegar um número inteiro (tamanho da matriz desejada) e produzir uma matriz do tamanho desejado. Pessoalmente, prefiro a primeira abordagem usando referência de método do que a posterior usando expressão lambda.
fonte
stream()
usartoArray()
. Pode serset.toArray(new String[0])
set.toArray(new String[set.size()]);
Use o método toArray (T [] a) :
fonte
[0]
deve ser substituído por[myset.size()]
como na resposta aceita.set.toArray(new String[0])
tem uma perfomance melhor do queset.toArray(new String[set.size()]
Estilo de goiaba:
mais informações: https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/FluentIterable.html
fonte
No Java 11, podemos usar o
Collection.toArray(generator)
método O código a seguir criará uma nova matriz de String:Consulte: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html#toArray(java.util.function.IntFunction)
fonte
fonte
Eu estava enfrentando a mesma situação.
Começo declarando as estruturas necessárias:
Set<String> myKeysInSet = null; String[] myArrayOfString = null;
No meu caso, eu tenho um objeto JSON e preciso que todas as chaves nesse JSON sejam armazenadas em uma matriz de cadeias. Usando a biblioteca GSON , uso JSON.keySet () para obter as chaves e mover para o meu conjunto:
myKeysInSet = json_any.keySet();
Com isso, tenho uma estrutura Set com todas as chaves, conforme necessário. Então, eu só preciso dos valores para minha matriz de strings. Veja o código abaixo:
myArrayOfString = myKeysInSet.toArray(new String[myKeysInSet.size()]);
Esta foi minha primeira resposta no StackOverflow. Desculpe por qualquer erro: D
fonte