Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 32
  1. #1

    [Java] Controllo buchi in una lista di numeri

    Devo fare una procedura che controlla se in una lista di numeri ci sono dei buchi oppure no.
    Il problema è che ci possono essere anche dei valori ripetuti nella lista, quindi in questo caso non saprei come fare.
    Il seguente codice scandisce i numeri e li stampa se non sono progressivi:
    codice:
          DocumentoVenditaTes ddt = (DocumentoVenditaTes) Factory.createObject(DocumentoVenditaTes.class, app);
          String orderBy = SQLHelpler.compressKey(new String[]{"numeroDDTCliente"});
          NavigableList nav = ddt.read(orderBy);
          // Numero DDT
          NumericLTBL numeroDDT = new NumericLTBL(ddt.getNumeroDDTCliente().getCName(), ddt.getNumeroDDTCliente().getAName());
          NumericLTBL cont = new NumericLTBL(ddt.getNumeroDDTCliente().getCName(), ddt.getNumeroDDTCliente().getAName());
          cont.setFormatted("0");
          NumericLTBL uno = new NumericLTBL(ddt.getNumeroDDTCliente().getCName(), ddt.getNumeroDDTCliente().getAName());
          uno.setFormatted("1");
          
          while (nav.hasNextElement()) {
          	ddt = (DocumentoVenditaTes) nav.nextElement();
          	if(!ddt.getNumeroDDTCliente().getFormatted().equals(ddt.getNumeroDDTCliente().getNullValue())){
          		numeroDDT.setFormatted(ddt.getNumeroDDTCliente().getFormatted());
          		cont.add(uno);
          		if(!numeroDDT.getFormatted().equals(cont.getFormatted())){
          			System.out.println(ddt);
          		}   		
          	}    	
          }
    In questo modo però al primo buco stamperà tutti gli altri numeri perchè non sono più "allineati". Mentre io vorrei stampare sono i buchi: come potrei sistemare il codice?

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    buchi rispetto a? 1 2 3 4 5 6 8, manca il 7 è un buco? Oppure buchi rispetto a una qualche funzione? 3 6 9 15, manca 12 c'è un buco?

    Puoi sempre creare una lista di appoggio con chiavi/valori in ordine, poi scandisci la tua lista di numeri e rimuovi dalla lista di appoggio tutti i numeri nella tua lista. Se ti avanzano elementi nella lista d'appoggio, quelli sono i tuoi buchi.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Ho una lista di numeri del tipo: 1 1 2 3 4 4 5 7....in questo caso deve ritornare 6.
    I numeri li reperisco già in ordine.

    Stavo pensando di mettere i numeri in un array ma mi sono bloccato....

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da Fabietto206
    Ho una lista di numeri del tipo: 1 1 2 3 4 4 5 7....in questo caso deve ritornare 6.
    I numeri li reperisco già in ordine.

    Stavo pensando di mettere i numeri in un array ma mi sono bloccato....
    Scorri tutta la lista, per ogni elemento controlla se è maggiore del precedente + 1, in caso positivo hai trovato un buco (che è proprio il numero precedente + 1), a questo punto fanne quello che vuoi (ad esempio darlo come valore di ritorno della procedura) e se necessario prosegui l'iterazione della lista... se ho compreso le specifiche.

  5. #5
    E se usassi un vettore al posto di una lista?

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da Fabietto206
    E se usassi un vettore al posto di una lista?
    Non cambia nulla, se non usare il metodo get (vedi la documentazione e/o i tutorial) al posto della notazione con le parentesi quadre (se stai usando un array, altrimenti è tutto uguale).

  7. #7
    Ho fatto così:
    codice:
    while (nav.hasNextElement()) {
          	ddt = (DocumentoVenditaTes) nav.nextElement();
          	if(!ddt.getNumeroDDTCliente().getFormatted().equals(ddt.getNumeroDDTCliente().getNullValue())){
          		for(int i=0; i<vettoreNumeroDDT.length-1; i++){
            		vettoreNumeroDDT[i] = new NumericLTBL(ddt.getNumeroDDTCliente().getCName(), ddt.getNumeroDDTCliente().getAName());
            		vettoreNumeroDDT[i].setFormatted(ddt.getNumeroDDTCliente().getFormatted());
            		Integer elSucc = vettoreNumeroDDT[i+1].intValue();
            		// caso in cui il numero successivo è =
              	if(!vettoreNumeroDDT[i].getFormatted().equals(elSucc) || 
              			!vettoreNumeroDDT[i].getFormatted().equals(elSucc - 1)){
              		// ci sono buchi
              		Integer elCorrente = vettoreNumeroDDT[i].intValue();
              		Integer elCor = elCorrente + 1;
                	while(elCor < elSucc){
                		cont.add(uno);
                		elCor++;
                		pdf.writeNewRow(FieldMapping.getValueOfAttribute(elCor, "numeroDDTCliente"), 0);
                	}
              	}      		     		
            	}
          	}
    Però va in NullPointer, cosa sbaglio?

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da Fabietto206
    Ho fatto così:
    codice:
    while (nav.hasNextElement()) {
          	ddt = (DocumentoVenditaTes) nav.nextElement();
          	if(!ddt.getNumeroDDTCliente().getFormatted().equals(ddt.getNumeroDDTCliente().getNullValue())){
          		for(int i=0; i<vettoreNumeroDDT.length-1; i++){
            		vettoreNumeroDDT[i] = new NumericLTBL(ddt.getNumeroDDTCliente().getCName(), ddt.getNumeroDDTCliente().getAName());
            		vettoreNumeroDDT[i].setFormatted(ddt.getNumeroDDTCliente().getFormatted());
            		Integer elSucc = vettoreNumeroDDT[i+1].intValue();
            		// caso in cui il numero successivo è =
              	if(!vettoreNumeroDDT[i].getFormatted().equals(elSucc) || 
              			!vettoreNumeroDDT[i].getFormatted().equals(elSucc - 1)){
              		// ci sono buchi
              		Integer elCorrente = vettoreNumeroDDT[i].intValue();
              		Integer elCor = elCorrente + 1;
                	while(elCor < elSucc){
                		cont.add(uno);
                		elCor++;
                		pdf.writeNewRow(FieldMapping.getValueOfAttribute(elCor, "numeroDDTCliente"), 0);
                	}
              	}      		     		
            	}
          	}
    Però va in NullPointer, cosa sbaglio?
    Se ci dici la riga che solleva la NPE...

  9. #9
    Qui:
    codice:
    Integer elSucc = vettoreNumeroDDT[i+1].intValue();

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Originariamente inviato da Fabietto206
    Qui:
    codice:
    Integer elSucc = vettoreNumeroDDT[i+1].intValue();
    Nelle righe precedenti inizializzi l'oggetto alla posizione i mentre in questa cerchi di usare quello di indice i+1, che non è ancora inizializzato (verrà inizializzato all'iterazione successiva).

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.