web-dev-qa-db-fra.com

N'imprimez que les nombres qui sont le double d'un autre nombre du tableau dans Java

Je pratique des algorithmes et disons que nous avons un tableau avec des éléments 2, 3, 9, 12, 7, 18, alors je veux imprimer 18 uniquement parce que c'est le double de 9. Lorsque j'imprime le résultat, il affiche toujours beaucoup plus de lignes, cependant, les nombres imprimés (s'il y en a) sont bons. Comment gérer correctement l'affichage du résultat? (En utilisant uniquement des tableaux.) Je sais que c'est une question idiote, mais j'ai essayé de nombreuses façons et ce n'était que pire.

Maintenant, il me montre ceci par exemple (140 est correct, mais l'autre ligne n'est pas nécessaire):

The following number is doubled of another number from the array: 0
The following number is doubled of another number from the array: 0
The following number is doubled of another number from the array: 140
The following number is doubled of another number from the array: 0
The following number is doubled of another number from the array: 0

Mon code:

public class DoubleNums {

    public static void main(String[] args) {

        Random random = new Random();

        int[] array = new int[50];
        int[] even;
        int[] doubleNum;
        int count = 0;
        int doubles = 0;

        for (int i = 0; i < array.length; i++) {
            array[i] = random.nextInt(200);
            System.out.println(array[i] + " ");
        }
        for (int j = 0; j < array.length; j++) { 
            even = new int[array.length];
            if (array[j] % 2 == 0) {
                even[count] = array[j];
                count++;
            }
            for (int k = 0; k < array.length; k++) {
                doubleNum = new int[array.length];
                if (array[j] / 2 == array[k]) {
                    even[doubles] = k;
                    doubles++;
                    System.out.println("The following number is doubled of another number from the array: " + even[doubles]);               
                }                
            }               
        }
        System.out.println("Number of even nums: " + count);
        }
    }
8
HuserB1989

Recherche binaire sur un tableau trié

Une autre approche consiste à trier le tableau ( Arrays.sort ), puis effectuez une recherche binaire à plusieurs reprises ( Arrays.binarySearch ).

Je ne sais pas si cela pourrait ou non être plus rapide que l'approche de hachage dans d'autres réponses.

En utilisant Arrays.sort modifie le tableau d'origine. Copiez donc d'abord le tableau si cela vous intéresse.

Pour rendre la recherche binaire un peu plus rapide, spécifiez une sous-plage du tableau.

// int streamSize = 6, randomNumberOrigin = 1, randomNumberBound = 18;
// Half-Open: Origin is inclusive, Bound is exclusive.
// int[] ints =
//        ThreadLocalRandom
//            .current()
//            .ints( streamSize , randomNumberOrigin , randomNumberBound )
//            .toArray();

int[] ints = { 2, 3, 9, 12, 7, 18 } ;

System.out.println( "array = " + Arrays.toString( ints ) );

Arrays.sort( ints );
List < Integer > doubledNumbers = new ArrayList <>();
int index = 0;
for ( int anInt : ints )
{
    int doubled = ( anInt * 2 );
    // Javadoc: binarySearch​ (int[] a , int fromIndex , int toIndex ,
    // int key ). First element inclusive, last element exclusive.
    int position = Arrays.binarySearch( ints , index , ints.length , doubled );
    // If the doubled value is found, remember it.
    if ( position >= 0 ) { doubledNumbers.add( ints[ position ] ); }
    // Prepare for next loop.
    index++;
}
System.out.println( "doubledNumbers: " + doubledNumbers.toString() );

Lorsqu'il est exécuté.

tableau = [2, 3, 9, 12, 7, 18]

doubledNumber: [18]

Au fait, j'ai pensé à utiliser un SortedSet tel que TreeSet . Mais après un rapide coup d'œil au code source OpenJDK version 14 , la méthode contains semble utiliser un itérateur à travers tous les éléments sans optimisation en tirant parti du maintien des clés dans un ordre trié.

1
Basil Bourque

Eh bien, j'ai réussi ce que je voulais aborder dans ma question mais tout le monde a été très utile donc je ne sais pas quelle réponse dois-je accepter :)

Random random = new Random();

int[] array = new int[50];
int[] newArray;
int evenNumber;

for (int i = 0; i < array.length; i++) {
    array[i] = random.nextInt(200);
    System.out.println(array[i] + " ");
}
newArray = new int[array.length];
for (int i = 0; i < array.length; i++) {
    if (array[i] % 2 == 0) {
        evenNumber = array[i];
        for (int j = 0; j < array.length; j++) {
            if (array[j] * 2 == evenNumber) {
                evenNumber = i;
                System.out.println("The searched numbers: " + array[evenNumber]);
            }
        }
    }
}
0
HuserB1989