Eu estou tentando reverter uma matriz int em Java.
Este método não reverte a matriz.
for(int i = 0; i < validData.length; i++)
{
int temp = validData[i];
validData[i] = validData[validData.length - i - 1];
validData[validData.length - i - 1] = temp;
}
O que está errado com isso?
Respostas:
Para inverter uma matriz int, você troca itens até chegar ao ponto médio, assim:
Do jeito que você está fazendo isso, você troca cada elemento duas vezes, para que o resultado seja o mesmo da lista inicial.
fonte
validData.length / 2
parte do lado de fora do loop for.validData.length >> 1
. Isso é equivalente e mais rápido, mas confunde muitos programadores e qualquer bom compilador fará isso automaticamente.validData.length - i - 1
e salvá-lo em uma variável.Com o Commons.Lang , você pode simplesmente usar
Na maioria das vezes, é mais rápido e mais seguro para os bichos ficar com bibliotecas facilmente disponíveis, já testadas em unidade e testadas pelo usuário quando cuidam do seu problema.
fonte
fonte
int
s neste caso) são agrupados em seus respectivos invólucros (Integer
s neste caso) e colocados na lista. Você vê,Integer
s são objetos. @Tomint[]
é diferente deInteger[]
. Experimente:Integer[] array = new int[5]
. Você receberá um erro de compilação. É por isso que aArrays
classe Java define vários métodos para trabalhar com matrizes primitivas. Tentar passar umint[]
para o método acima resultará em algo comoThe method reverse(Object[]) in the type MakeSimple is not applicable for the arguments (int[])
. @Filip - um algoritmo no local usa menos memória e roda mais rápido.Arrays.asList()
não faz referência à matriz original, nem a matriz retornada. Esse é um dos problemas desse método: ele usa o triplo da memória e o trabalho como um algoritmo no local.int[]
argumento para esse método ( "tipos incompatíveis: int [] não podem ser convertidos em Objeto []" ).java.util.Collections.reverse()
pode reverterjava.util.List
s ejava.util.Arrays.asList()
retorna uma lista que envolve a matriz do específico que você passar para ele, por issoyourArray
é revertido após a invocação deCollections.reverse()
.O custo é apenas a criação de um objeto de lista e nenhuma biblioteca adicional é necessária.
Uma solução semelhante foi apresentada na resposta de Tarik e seus comentadores, mas acho que essa resposta seria mais concisa e mais facilmente analisável.
fonte
int[]
paraasList(...)
não retornará aList<Integer>
, mas aList<int[]>
, contendo um elemento. Não existe no AFAICS uma maneira integrada simples de converter umint[]
para umInteger[]
.Arrays.stream(arr).boxed().collect(Collectors.toList())
ouArrays.stream(arr).boxed().toArray(Integer[]::new)
Eu acho que é um pouco mais fácil seguir a lógica do algoritmo se você declarar variáveis explícitas para acompanhar os índices que você está trocando a cada iteração do loop.
Eu também acho que é mais legível fazer isso em um loop while.
fonte
Já existem muitas respostas aqui, principalmente focadas na modificação do array no local. Mas, para fins de completude, aqui está outra abordagem usando fluxos Java para preservar a matriz original e criar uma nova matriz reversa:
fonte
Com goiaba:
fonte
asList
métodos, ele cria uma exibição que grava diretamente na matriz de backup (primitiva). Eu acho que o eleitor de baixo aqui erroneamente pensou que isso retornava uma lista em caixa ou algo assim.Collections.reverse
é um método nulo. Isso opera no local em uma classe interna do Guava que envolve umint[]
(Como nunca armazena uma lista deInteger
s em caixas, eu não chamaria a classe de "lista em caixas", mas sim de uma "exibição de lista de uma matriz"). Mas sim, ele opera através de uma interface que passaInteger
objetos, portanto, isso criaria uma grande quantidade de rotatividade e encaixe de objetos temporários, conforme mencionado. Tente umaIntStream
ou uma biblioteca de coleção primitiva para saber onde o desempenho é importante. (Trove, Koloboke, Eclipse Collections, ...)No caso do Java 8 , também podemos usar
IntStream
para reverter a matriz de números inteiros como:fonte
Simples para loop!
fonte
start <= end
parastart < end
Isso irá ajudá-lo
fonte
fonte
É assim que eu pessoalmente resolveria. A razão por trás da criação do método parametrizado é permitir que qualquer matriz seja classificada ... não apenas seus números inteiros.
Espero que você tire algo disso.
fonte
Collections.reverse(asList(arraytoReverse)); return arrayToReverse;
.asList
é apenas um invólucro em torno da matriz, portanto, a matriz original é invertida.Seu programa funcionará apenas para
length = 0, 1
. Podes tentar :fonte
Se você estiver trabalhando com dados mais primitivos (por exemplo, char, byte, int, etc.), poderá executar algumas operações divertidas do XOR.
fonte
for (int m = x.length, i = --m / 2; ++i <= m;) { x[i] ^= x[m - i]; x[i] ^= x[m - i] ^= x[i]; }
É mais eficiente simplesmente iterar a matriz para trás.
Não tenho certeza se a solução de Aaron faz esta ligação
Collections.reverse(list);
. Alguém sabe?fonte
fonte
fonte
Fazer dessa maneira não seria muito mais improvável por erros?
fonte
Solução com o (n) complexidade de tempo e o (1) complexidade de espaço.
fonte
for (int start = 0, end = array.length - 1; start < end; start++, end--) { ... }
.2 maneiras de reverter uma matriz.
Usando o loop For e troque os elementos até o ponto médio com a complexidade temporal de O (n / 2).
}
Usando a função incorporada (Collections.reverse ())
}
Saída: [6, 5, 4, 3, 2, 1]
fonte
Ints
?abaixo está o programa completo para executar em sua máquina.
Para programas em matriz usando matrizes, essa será a boa fonte. Acesse o link.
fonte
Usando a solução XOR para evitar a variável temp, seu código deve parecer
Veja este link para uma melhor explicação:
http://betterexplained.com/articles/swap-two-variables-using-xor/
fonte
fonte
Aqui está uma implementação simples, para reverter a matriz de qualquer tipo , além de suporte total / parcial .
Aqui está o teste de unidade correspondente
fonte
Aqui está o que eu vim com:
fonte
Existem duas maneiras de ter uma solução para o problema:
1. Inverta uma matriz no espaço.
Etapa 1. Troque os elementos no índice inicial e final.
Etapa 2. Incremente o índice inicial e diminua o índice final.
Etapa 3. Repita a Etapa 1 e a Etapa 2 até o índice inicial <índice final
Para isso, a complexidade do tempo será O (n) e a complexidade do espaço será O (1)
O código de exemplo para reverter uma matriz no espaço é como:
2. Inverta uma matriz usando uma matriz auxiliar.
Etapa 1. Crie uma nova matriz de tamanho igual à matriz especificada.
Etapa 2. Insira elementos na nova matriz iniciando no índice inicial, a partir da matriz especificada iniciando no índice final.
Para isso, a complexidade do tempo será O (n) e a complexidade do espaço será O (n)
O código de exemplo para reverter uma matriz com matriz auxiliar é como:
Além disso, podemos usar a API Collections de Java para fazer isso.
A API de coleções usa internamente o mesmo método de inversão no espaço.
O código de exemplo para usar a API de coleções é como:
fonte
fonte
fonte
fonte
Há algumas ótimas respostas acima, mas foi assim que eu fiz:
fonte