|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Cavezzo (MO)
Messaggi: 1928
|
[Java] Gestione delle matrici
Nel software su cui sto lavorando ho la necessità di dichiararmi una matrice di interi
int [][]dataMatrix = new int[3][7] Più avanti nel codice devo determinare se un certo valore è presente o meno all'interno della COLONNA 1, e in quel caso farmi restituire la sua posizione (l'indice). allora mi sono scritto una funzione di questo tipo: public int findIndex(int column[], int value) { int k = 0; boolean valueFound = false; for (k = 0; (k < column.length) || (!valueFound); k++) { if (column[k] == value) { valueFound = true; } } return (k); } il mio problema è su come richiamare tale funzione Se da codice scrivo: int index = findIndex(dataMatrix[0], valore) la funzione mi cerca il valore nella prima RIGA. A me serve invece la prima COLONNA. C'è un modo per specificare la colonna e non la riga? ho provato con int index = findIndex(dataMatrix[][0], valore) ma continua a darmi errore. Grazie per l'attenzione Davide
__________________
Case: NZXT Phantom 820 White Ali: Seagate PRIME-TX-1300 TITANIUM CPU: Ryzen 7 5800X3D Dissi: CORSAIR Hidro H150i PRO XT MB: ASUS X570-F Strix RAM: 4x16GB CORSAIR VENGEANCE 3600 CL16 Video: MSI RTX 4080 Suprim X Cuffie: Audio-Technica ADG1X HD: Sabrent M.2 PCIe 4 512GB - 1 TB Sabrent M.2 - Seagate Barracuda 2TB Monitor1: LG 27GP850-B Monitor2: ASUS VG279QM Mouse: Razer Deathadder V2 Tastiera: Corsair K70 RGP PRO UPS: APC Smart-UPS 1000 VA SMT1000I |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
o ti crei la matrice per colonne (cioè quelle che ora solo le colonne diventano le righe e viceversa) oppure modifichi il metodo in modo che riceva l'intera matrice:
public int findIndex(int mat[][], int value){ for (int k = 0; (k < mat.length); k++){ if (mat[k][1] == value) return k; } return -1; }
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals Ultima modifica di anx721 : 11-09-2005 alle 23:44. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jun 2001
Città: Alessandria (provincia)
Messaggi: 4772
|
Sono di fretta e non entro nel merito del problema, ma a mio avviso avete fatto entrambi alcuni errorini:
@Benna80 1) Inizializzi K=0 e poi nel loop K parte da 0 e alla fine ritorni K: il che vuol dire che presupponi che il valore debba trovarsi sicuramente nell'array, perché altrimenti non riesci a distinguere tra il K=0 perché non hai trovato nulla e il K=0 perché l'hai trovato alla prima 2) metter "|| (!valueFound)" non serve a niente, perché essendo in && non ferma il loop nel caso lo trovassi. Devi metterlo in && @anx721 non puoi ritornare k perché l'hai dichiarato nel for Ovviamente in questo caso è una svista che emerge in compilazione. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: Cavezzo (MO)
Messaggi: 1928
|
Quote:
Ora vi chiedo un'altra cosa, ma non so se è giusto mantenerlo su questo thread dal momento che si tratta di una cosa che non centra nulla con il problema di prima. Ho una matrice di n x 2 di long. i due valori di ogni riga sono strettamente correlati tra loro. Ora, ho la necessità di ordinare i numeri della prima colonna facendo in modo che se viene spostato un valore, anche il valore della colonna 2 lo segua: Esempio: PRIMA DELL'ORDINAMENTO: 1766915 3 12368405 2 10601490 1 devo ordinare la matrice in base alla prima colonna, mantenendo le corrispondenze tra righe: DOPO L'ORDINAMENTO 12368405 2 10601490 1 1766915 3 Mi è stato suggerito di usare l'oggetto TreeMap, ma sulla documentazione di Sun non c'è scritto un gran che. Mi potreste dare una mano voi, una qualche dritta? Grazie e scusatemi se non ho aperto un thread apposito, se non mi vorrete rispondere ne farò uno nuovo. Davide
__________________
Case: NZXT Phantom 820 White Ali: Seagate PRIME-TX-1300 TITANIUM CPU: Ryzen 7 5800X3D Dissi: CORSAIR Hidro H150i PRO XT MB: ASUS X570-F Strix RAM: 4x16GB CORSAIR VENGEANCE 3600 CL16 Video: MSI RTX 4080 Suprim X Cuffie: Audio-Technica ADG1X HD: Sabrent M.2 PCIe 4 512GB - 1 TB Sabrent M.2 - Seagate Barracuda 2TB Monitor1: LG 27GP850-B Monitor2: ASUS VG279QM Mouse: Razer Deathadder V2 Tastiera: Corsair K70 RGP PRO UPS: APC Smart-UPS 1000 VA SMT1000I |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Se sei in grado di ordinare un array di elementi dovresti essere in grado di ordinare anche la matrice: basta fare i confronti sul primo elemento della riga e quando necessario scambiare le righe nella matrice (il che ti evita di scambiare direttamente entrambi gli elementi delle righe). Se non vuoi implementare l'algoritmo di ordinamento puoi utilizare Collections.sort che prende come parametro una List (ad esempio un Vector) degli elementi da ordinare, in questo caso delle righe, e un Comparator che cofnronta gli elementi.
PS: il codice che avevo scritto prima l'ho corretto; l'ultimo return deve ritornare un valore negativo per indicare che l'elemento non è stato trovato nella colonna.
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: Cavezzo (MO)
Messaggi: 1928
|
Quote:
Grazie ancora, ti farò sapere in ogni caso, sia che riesca sia che abbia delle difficoltà Davide
__________________
Case: NZXT Phantom 820 White Ali: Seagate PRIME-TX-1300 TITANIUM CPU: Ryzen 7 5800X3D Dissi: CORSAIR Hidro H150i PRO XT MB: ASUS X570-F Strix RAM: 4x16GB CORSAIR VENGEANCE 3600 CL16 Video: MSI RTX 4080 Suprim X Cuffie: Audio-Technica ADG1X HD: Sabrent M.2 PCIe 4 512GB - 1 TB Sabrent M.2 - Seagate Barracuda 2TB Monitor1: LG 27GP850-B Monitor2: ASUS VG279QM Mouse: Razer Deathadder V2 Tastiera: Corsair K70 RGP PRO UPS: APC Smart-UPS 1000 VA SMT1000I |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2001
Città: California
Messaggi: 7174
|
Ragazzi scusate se mi intrometto ma vedo che siete esperti, ho un problema con i file jsp:
ho fatto un controllo "anti-intrusione" nei miei jsp che controlla se una variabile nell'oggetto session e' settata o meno. Ovviamente quando entro (login) la setto ad un valore, quando esco (logout) la rimetto a null. Peccato che se con il browser client faccio logout (e in teoria ora e' a null), poi faccio back e navigo nel mio sito in teoria dovrei essere buttato fuori, in pratica me lo da buono. Cordice di controllo di ogni jsp: Codice:
if ((session.isNew()) || (session.getAttribute("security")==null) || (session.getAttribute("security")!="ProfPass"))
{
%>
<jsp:forward page="loginProf.jsp"/>
<%
}
Codice:
<%
session.setAttribute("security",null);
%>
<jsp:forward page="loginProf.jsp"/>
__________________
Il mio case prima della "cura" --> Il mio case...dopo! .oO (Firefox Myths) Myths Oo. |
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Apr 2009
Messaggi: 5
|
Matrice di Liste
Vi propongo il mio problema con le matrici...
Devo scrivere un programma in java che gestisca un'agenda di appuntamenti. La mia idea è stata quella di creare una matrice 12 x 31 che rappresenta un anno intero. Ogni casella di questa matrice è un oggetto di LinkedList che a sua volta contiene oggetti di tipo appuntamento in modo ordanato secondo la data. Il mio problema è questo. Come faccio a fare in modo che ogni lista (oltre agli appuntamenti del giorno che rappresenta) contenga un puntatore alla lista del giorno successivo (cioè la casella successiva) ?? Se avete qualche idea migliore della matrice di liste proponete pure.... Grazie Obinna |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
|
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Quote:
Quindi le celle della matrice [12x31] verranno popolate da istanze di Giornata. Scritto di getto: non credo questa sia la migliore astrazione per rappresentare un'agenda. Diciamo che per pensarne una come si deve (sempre ammesso di non andare prima a informarsi di come si sia già implementata un'agenda, dato che presumibilmente è un problema che sarà già stato risolto in maniera ottimale) bisognerebbe prima fare una piccola analisi del problema da risolvere, a partire da una sua descrizione, e vedere che classi saltano fuori, man mano che si sviscera la cosa. Infatti, ma sarà difficile che ti risponda
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 20-05-2009 alle 14:37. |
||
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Salve a tutti,
stavo cercando qualcosa sull'ordinamento di matrici per colonna ed ho trovato questo thread. Dal momento che dovrei ordinare una matrice che all'occorrenza può essere anche molto grande (in numero di righe), avrei pensato al merge sort. Il problema è che a partire dal merge sort per array di interi, ho qualche problema a trasformarlo in merge sort per matrici. La mia matrice da ordinare è composta da: 1a colonna, int 2a colonna, Date 3a colonna, int Io vorrei ordinare questa matrice per data (in ordine crescente). L'algoritmo di partenza sarebbe questo: Codice:
public static void mergeSort(int[] arr, int i, int f) {
if(f <= i)
return;
int m = (i+f)/2;
mergeSort(arr, i, m);
mergeSort(arr, m+1, f);
//Merge step
int[] tmp = new int[f-i+1];
int i1 = i, i2 = m+1, j = 0;
while(i1 <= m || i2 <= f)
if(i2 > f || (i1 <=m && arr[i1] <= arr[i2]))
tmp[j++] = arr[i1++];
else
tmp[j++] = arr[i2++];
//Copy back to original array
j = 0;
while(i <= f)
arr[i++] = tmp[j++];
}
public static void mergeSort(int[] arr) {
mergeSort(arr, 0, arr.length-1);
}
Ho fatto qualche prova, ma ho dei problemi, anche con lo "scambio" di righe per esempio. |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
a me non emerge un bel niente.
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
La classe Date (java.util.Date) implementa l'interfaccia Comparable<Date>.
Significa che, dato un array o collection di oggetti Date, ottieni l'odinamento in ordine ascendente semplicemente invocando: Codice:
List<Date> mieDate; // Date[] arrDate; ... Collections.sort(mieDate); // Arrays.sort(arrDate); Detto questo, io tenterei di sfruttare ciò che il JDK mette già a disposizione (se lo scopo non è quello dell'esercitarsi). Io vedo due strade. 1 - se i campi nelle tre colonne (int, Date, int) rappresentano dati che possono essere raggrupati logicamente in un oggetto, potresti implementare una classe che estende Date e ha due campi di tipo int o Integer. A quel punto tratti una riga come un oggetto sifatto, hai che la tua classe estendendo Date già implementa l'interfaccia Comparable e quindi una eventuale collezione/array di questi oggetti (le righe della tua matrice) è passabile come argomento al metodo Collections.sort() per ottenere l'ordinamento in senso ascendente. Se poi servisse averlo in senso descrescente basta passare la lista ordinata a Collections.reverse() oppure definire un Comparator apposito. Con in più la possibilità di poter sovvrascrivere il metodo compareTo già fornito da Date per tenere conto anche del caso in cui hai due o più oggetti con Date dello stesso valore (non so se può succedere) e quindi dover discriminare anche in base al valore dei due campi int. 2 - se i campi delle tre colonne (int, Date, int) non possono essere raggruppati in un unico oggetto, si può comunque sfruttare Collections.sort() vedendo la 2a colonna come una lista di oggetti Date ognuno associato al valore dell'indice della posizione che occupa nella lista (numero di riga corrente); questo può essere rappresentato da una classe che contiene due campi: uno per Date e uno per l'indice. Si fa il sort di questa lista e la si rilegge con un ciclo recuperando i valori degli indici riordinati che indicano il nuovo ordine delle righe della matrice.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 02-03-2010 alle 01:20. |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Asd, fero86 pure tu
, ma basta quotare roba di cinque anni fa ![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 02-03-2010 alle 01:17. |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
![]() non me ne ero minimamente accorto
|
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
banryu79 grazie per la risposta.
No, lo scopo non è quello di esercitarsi. I dati nelle tre colonne non possono essere raggruppati purtroppo, o meglio, non mi conviene usare gli oggetti in questo caso. Vorrei lavorare con le matrici direttamente. Es. 1 10/05/2010 33 4 11/12/2009 45 5 07/02/2010 39 Dovrebbe riordinarmeli così: 4 11/12/2009 45 5 07/02/2010 39 1 10/05/2010 33 Niente di diverso dall'ordinamento per colonna implementato nelle JTable, e nei fogli di calcolo. Quello che mi sembra strano è che non ci sia qualcosa di già pronto nelle API Java. |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Dunque, ho cercato di adattare il merge sort al moi caso:
Codice:
import java.sql.Date;
import java.util.GregorianCalendar;
public class Sorting {
public static void mergeSort(Object[][] o, int i, int f) {
if(f <= i)
return;
int m = (i+f)/2;
mergeSort(o, i, m);
mergeSort(o, m+1, f);
//Merge step
Object[][] tmp = new Object[f-i+1][3];
int i1 = i, i2 = m+1, j = 0;
while(i1 <= m || i2 <= f)
if(i2 > f || (i1 <=m && ((Date)o[i1][1]).compareTo((Date)o[i2][1]) <= 0)){
tmp[j++][0] = o[i1++][0];
tmp[j++][1] = o[i1++][1];
tmp[j++][2] = o[i1++][2];
}else{
tmp[j++][0] = o[i2++][0];
tmp[j++][1] = o[i2++][1];
tmp[j++][2] = o[i2++][2];
}
//Copy back to original array
j = 0;
while(i <= f){
o[i++][0] = tmp[j++][0];
o[i++][1] = tmp[j++][1];
o[i++][2] = tmp[j++][2];
}
}
public static void mergeSort(Object[][] o) {
mergeSort(o, 0, o.length-1);
}
public static void main(String[] args){
Object[][] o = new Object[3][3];
o[0][0] = 1; o[0][1] = new Date((new GregorianCalendar(2010, 9, 1)).getTimeInMillis()); o[0][2] = 15;
o[1][0] = 2; o[1][1] = new Date((new GregorianCalendar(2009, 10, 1)).getTimeInMillis()); o[1][2] = 16;
o[2][0] = 3; o[2][1] = new Date((new GregorianCalendar(2008, 9, 1)).getTimeInMillis()); o[2][2] = 17;
stampa(o);
mergeSort(o);
System.out.println();
stampa(o);
}
public static void stampa(Object[][] a){
for (int i=0;i<a.length;i++){
for (int j=0; j<a[0].length; j++)
System.out.print(a[i][j]+" ");
System.out.println();
}
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 at Sorting.mergeSort(Sorting.java:24) at Sorting.mergeSort(Sorting.java:11) at Sorting.mergeSort(Sorting.java:36) at Sorting.main(Sorting.java:45) Non riesco a capire perché accada. Ho fatto il caso specifico che serve a me, ovvero l'ordinamento di una matrice n righe x 3 colonne, in cui la seconda colonna è una data. Mi sapete dare una mano? Se serve il merge sort "originale" dal quale sono partito non avete che da chiedere. |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Alla fine ho fatto come hai detto, banryu79!
Ho raggruppato le righe della matrice in oggetti, e ho usato il merge sort appena postato per ordinare l'array di quegli oggetti, in base ad un campo. (Piccola modifica al merge sort che ho postato prima). A quel punto ho ritrasformato l'array di oggetti in matrice ed il gioco è fatto. Grazie! |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
|
1) in java si programma ad oggetti, queste porcherie procedurali lasciamole a chi sviluppa C
2) per accedere puntualmente era meglio usare una hash + arraylist (classica lista di adiacenze che rappresenta il grafo) e poi scegliere quale algoritmo usare per la ricerca (ordinamento topografico + algo di ricerca) 3) testiamo la classe con junit con vari input per vedere le performance e ci accorgiamo quanto sia performante ( dove input > 1k numeri ) 4) riuso del codice? usare dei comparatori ad hoc, interfacce e gestire il codice in modo più modulare (se interessato posso postare esempi)
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85 |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
No no, grazie!
Ho altre gatte da pelare ora. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:26.













, ma basta quotare roba di cinque anni fa 








