|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2002
Città: Nosgoth
Messaggi: 16899
|
[Java] Fusione di due array con ordinamento
Ecco un altro esercizio
Dati due array (ordinati), dare come output un nuovo array che contiene i due precedenti ordinati. A prescindere che siano ordinati o meno la mia idea sarebbe stata di: 1) dare in input la prima serie di numeri 2) dare in input la seconda serie di numeri 3) creare un nuovo array fusione la cui lunghezza sia la somma dei due precedenti 5) un ciclo che copi tutto il primo array dalla posizione 0 del nuovo array fino alla lunghezza del primo array (se array è di 3 numeri da 0 a 2) 6)un altro ciclo che parta dalla prima posizione libera dell'array fusione (che secondo me è data dalla lunghezza totale del primo array+1) fino alla fine del secondo array 7) Utilizzare il bubble sort per ordinare il nuovo array Il mio codice fa la fusione del primo ma del secondo array mi riporta solo un numero del tipo primo array {9,8,7} e secondo array {6,5,4} il nuovo vettore che mi mostra è {9,8,7,0,4,0} Dove ho sgarrato? Codice:
import javax.swing.*;
public class fusione {
public static void main (String[] args){
String lunghezza1 = JOptionPane.showInputDialog("Inserisci il numero di elementi del primo vettore");
int contatoreprimo = Integer.parseInt(lunghezza1);
int []vettore = new int [contatoreprimo];
for (int i=0;i<contatoreprimo;i++)
{
String k = JOptionPane.showInputDialog("Inserisci il numero"+(i+1));
int numeroprimo = Integer.parseInt(k);
vettore[i]= numeroprimo;
}
String lunghezza2 = JOptionPane.showInputDialog("Inserisci gli elementi del secondo vettore");
int contatoresecondo = Integer.parseInt(lunghezza2);
int [] vettore1 = new int [contatoresecondo];
for (int j=0;j<contatoresecondo;j++)
{
String h = JOptionPane.showInputDialog("Inserisci il numero"+(j+1));
int numerosecondo = Integer.parseInt(h);
vettore1[j]= numerosecondo;
}
int []vettorefusione = new int[vettore.length+vettore1.length];
int i =0;
while (i<vettore.length)
{
vettorefusione[i]=vettore[i];
i++;
}
int j = (vettore.length+1);
int appoggio=0;
while (appoggio<vettore1.length)
{
vettorefusione[j]=vettore1[appoggio];
appoggio++;
}
int cont1=0;
while (cont1<vettorefusione.length)
{
System.out.print(vettorefusione[cont1]);
cont1++;
}
}
}
Il mio è un corso di un anno sviluppo software e ci stanno riempiendo di nozioni con un numero limitatissimo di ore e stiamo facendo di tutto (html, css, php,xml,java, script di linux) e sto facendo un po di confusione quindi vorrei limitare al solo apprendimento di un algoritmo di ordinazione
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
dalle api di java:
Codice:
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
Copies an array from the specified source array, beginning at the specified position, to the specified position of the destination array.
Codice:
Systemò.arraycopy(...)
__________________
My gaming placement |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2002
Città: Nosgoth
Messaggi: 16899
|
Ok ma nel mio dove sta il problema?
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
giusto...allora "I PROBLEMI" sono qui:
Quote:
__________________
My gaming placement |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
Quote:
secondo me, rileggendo questa traccia, devi creare il terzo array in modo diverso....
__________________
My gaming placement |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Apr 2002
Città: Nosgoth
Messaggi: 16899
|
Quote:
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
il fatto che i due array siano ordinati può voler dire 2 cose...oc he fai un controllo quando inserisci i singoli elementi negli array, oppure che "presupponi" che gli arrray sono ordinati e quindi ti avvantaggi nella costruzione del nuovo array.
pensa, se il primo array è [1,2,3] e il seondo è [4,5,6] la costruzione finale è array1+array2....semplice no??? questo lo puoi dire perchè i due arrray sono ordinati e il primo elemento del 2 vettore è più grande dell'ultimo del primo vettore. ora, magari mi stoi flippando ioo, ma secondo me devi lavorare in questo senso, ovvero, prendi v1[0] e lo confronti con 2[0], se v10]<v2[0] allora in fusion[0] metti v1[0]....e così via. ripeto, magari è un flip mio.....comunque quello coorretto funziona
__________________
My gaming placement |
|
|
|
|
|
#8 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
la mia soluzione:
Codice:
public abstract class AbstractArray
{
protected int[] content;
protected void allocate(int length)
{
content = new int[length];
}
}
Codice:
public abstract class AbstractInputArray extends AbstractArray
{
public AbstractInputArray(BufferedReader reader) throws NumberFormatException, IOException
{
allocate(readLength(reader));
readValues(reader);
sort();
}
private int readLength(BufferedReader reader) throws NumberFormatException, IOException
{
System.out.print("input " + this + " length: ");
return new Integer(reader.readLine());
}
private void readValues(BufferedReader reader) throws NumberFormatException, IOException
{
System.out.println("input " + this + " elements:");
for (int index = 0; index < content.length; index++)
{
content[index] = new Integer(reader.readLine());
}
}
private void sort()
{
Arrays.sort(content);
}
}
Codice:
public class FirstArray extends AbstractInputArray
{
public FirstArray(BufferedReader reader) throws NumberFormatException, IOException
{
super(reader);
}
public String toString()
{
return "first array";
}
}
Codice:
public class SecondArray extends AbstractInputArray
{
public SecondArray(BufferedReader reader) throws NumberFormatException, IOException
{
super(reader);
}
public String toString()
{
return "second array";
}
}
Codice:
public class SequentialArray extends AbstractArray
{
private int index = 0;
public SequentialArray(AbstractArray source)
{
content = source.content;
}
public int getCurrentValue()
{
return content[index];
}
public int getNextValue()
{
return content[index++];
}
}
Codice:
public class MergedArray extends AbstractArray
{
private SequentialArray firstArray;
private SequentialArray secondArray;
public MergedArray(AbstractArray firstArray, AbstractArray secondArray)
{
allocate(firstArray.content.length + secondArray.content.length);
this.firstArray = new SequentialArray(firstArray);
this.secondArray = new SequentialArray(secondArray);
for (int index = 0; index < content.length; index++)
{
content[index] = select();
}
}
private int select()
{
int firstValue;
try
{
firstValue = firstArray.getCurrentValue();
}
catch (IndexOutOfBoundsException e)
{
return secondArray.getNextValue();
}
int secondValue;
try
{
secondValue = secondArray.getCurrentValue();
}
catch (IndexOutOfBoundsException e)
{
return firstArray.getNextValue();
}
return selectValue(firstValue, secondValue);
}
private int selectValue(int firstValue, int secondValue)
{
if (firstValue < secondValue)
{
return firstArray.getNextValue();
}
else
{
return secondArray.getNextValue();
}
}
public String toString()
{
return "merged array";
}
public void print()
{
for (int value : content)
{
System.out.print(value + ", ");
}
System.out.println("end");
}
}
Codice:
public class Test2
{
public static void main(String[] arguments) throws NumberFormatException, IOException
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
AbstractArray firstArray = new FirstArray(reader);
AbstractArray secondArray = new SecondArray(reader);
MergedArray mergedArray = new MergedArray(firstArray, secondArray);
System.out.print("thank you. " + mergedArray + ": ");
mergedArray.print();
}
}
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2002
Città: Nosgoth
Messaggi: 16899
|
Hai un po esagerato
Alla fine ho fatto così ma non so perchè il codice mio non funzionasse , poi provo a fare anche come aveva detto franciska con la sua interpretazione dell'esercizio Codice:
import javax.swing.*;
public class fusione {
static void swap(int a[], int primo, int secondo)
{
int tmp;
tmp = a[primo];
a[primo] = a[secondo];
a[secondo] = tmp;
}
static void bubblesort (int array [])
{
for (int pass=1; pass<array.length;pass++)
for (int pass1=0;pass1<array.length-1;pass1++)
if (array[pass1]>array[pass1+1])
swap (array,pass1,pass1+1);
}
public static void main (String[] args){
String lunghezza1 = JOptionPane.showInputDialog("Inserisci il numero di elementi del primo vettore");
int contatoreprimo = Integer.parseInt(lunghezza1);
int []vettore = new int [contatoreprimo];
for (int i=0;i<contatoreprimo;i++)
{
String k = JOptionPane.showInputDialog("Inserisci il numero"+(i+1));
int numeroprimo = Integer.parseInt(k);
vettore[i]= numeroprimo;
}
String lunghezza2 = JOptionPane.showInputDialog("Inserisci gli elementi del secondo vettore");
int contatoresecondo = Integer.parseInt(lunghezza2);
int [] vettore1 = new int [contatoresecondo];
for (int j=0;j<contatoresecondo;j++)
{
String h = JOptionPane.showInputDialog("Inserisci il numero"+(j+1));
int numerosecondo = Integer.parseInt(h);
vettore1[j]= numerosecondo;
}
int []vettorefusione = new int[vettore.length+vettore1.length];
int i =0;
while (i<vettore.length)
{
vettorefusione[i]=vettore[i];
i++;
}
int j = (vettore.length);
int appoggio=0;
while (appoggio<vettore1.length)
{
vettorefusione[j+appoggio]=vettore1[appoggio];
appoggio++;
}
int cont1=0;
bubblesort(vettorefusione);
while (cont1<vettorefusione.length)
{
System.out.print(vettorefusione[cont1]+"\t");
System.out.println ();
cont1++;
}
}
}
Ultima modifica di Redvex : 30-11-2007 alle 14:08. |
|
|
|
|
|
#10 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2002
Città: Nosgoth
Messaggi: 16899
|
Ah be potevi dirlo primo ora si che è più chiaro
Una domanda: io ho eclipse alla 3.3.1.1 posso mettere la lingua italiana usando il language pack della 3.2 dato che porta solo quello? |
|
|
|
|
|
#12 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
http://en.wikipedia.org/wiki/Plain_Old_Java_Object
intendevo dire che il design è semplicerrimo: il codice è distribuito in tanti metodi distribuiti a loro volta in tante classi, e ciascun metodo ha complessità molto bassa. su Diamond Crush lavoravamo sempre così (sigh, che bei ricordi ma non c'è problema, io ho trovato ben altro da fare |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
Quote:
....ma guarda che io l'ho scritto perchè non funziona....
__________________
My gaming placement |
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Apr 2002
Città: Nosgoth
Messaggi: 16899
|
Quote:
Mi riferivo piuttosto alla questione di inserire una if quando faccio la fusione Ultima modifica di Redvex : 30-11-2007 alle 16:49. |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
tu avevi sbagliato le parti commentate vicino a quelle in grassetto.....
il discorso di inserire un if è una mia supposizione, non sò se devi farla o se va bene come stai facendo tu....
__________________
My gaming placement |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 1232
|
RedVex secondo me è sbagliato l'approccio , tu ordini qualcosa che è già ordinato , non sfruttando il fatto che i due array sono ordinati . Da quello che so io bisogna confrontare i primi due elementi dei primo e del secondo array e inserire il più piccolo nell'array Fusione , e incrementare l'indice dell'array che aveva l'elemento più piccolo , ( se l'elemento + piccolo era quello del primo array ) si confronta il secondo elemento del primo array col primo elemento del secondo array e così via. Alla fine se uno dei due array finisce prima ( significa che i due array avevano dimensione diversa) allora si copia l'array restante nell'array Fusione. Non so se sono stato chiaro.
__________________
Cpu: Amd 64 X2 5200+ - Mobo:M2N32SLI DELUXE - Ram: Corsair xms2 800 mhz kit 4gb - SK Video: Gaiward GTS250 - Ali : Enermax Liberty 500 Wat - Mast DVD: 2 Nec AD-5170A - Case : Thermaltake Armor+ - Dissipatore: Thermaltake V1 Notebook: Sony Vaio VGN-Fe21M-Pda: Htc Diamond |Il mio sito|Flickr| Stanco del solito forum? Vieni a parlare di fotografia su Fotoni |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Apr 2002
Città: Nosgoth
Messaggi: 16899
|
Quote:
|
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 1232
|
Come ho detto io li inserisci ordinati perchè sfrutti proprio l'ordinamento dei due vettori iniziali
__________________
Cpu: Amd 64 X2 5200+ - Mobo:M2N32SLI DELUXE - Ram: Corsair xms2 800 mhz kit 4gb - SK Video: Gaiward GTS250 - Ali : Enermax Liberty 500 Wat - Mast DVD: 2 Nec AD-5170A - Case : Thermaltake Armor+ - Dissipatore: Thermaltake V1 Notebook: Sony Vaio VGN-Fe21M-Pda: Htc Diamond |Il mio sito|Flickr| Stanco del solito forum? Vieni a parlare di fotografia su Fotoni |
|
|
|
|
|
#19 |
|
Member
Iscritto dal: Jan 2007
Messaggi: 189
|
Questa è una classe che fonde due array ordinati (devono essere già ordinati come richiede l'esercizio)
Codice:
public class ArraysMerger {
private int[] firstOrderedArray;
private int[] secondOrderedArray;
private int[] result = null;
private int firstCurrent;
private int secondCurrent;
private int current;
public ArraysMerger(int[] firstArray, int[] secondArray) throws IllegalArgumentException{
try {
this.firstOrderedArray = firstArray;
this.secondOrderedArray = secondArray;
result = new int[resultLength()];
}
catch(NullPointerException ex){
throw new IllegalArgumentException();
}
}
public int[] merge(){
firstCurrent = 0;
secondCurrent = 0;
current = 0;
while(noArrayCompleted()) {
if(firstOrderedArray[firstCurrent] <= secondOrderedArray[secondCurrent])
result[current++] = firstOrderedArray[firstCurrent++];
else
result[current++] = secondOrderedArray[secondCurrent++];
}
fill(firstCurrent,firstOrderedArray);
fill(secondCurrent,secondOrderedArray);
return result;
}
// helpers methods
private int resultLength(){
return firstOrderedArray.length + secondOrderedArray.length;
}
private boolean noArrayCompleted(){
return firstCurrent < firstOrderedArray.length &&
secondCurrent < secondOrderedArray.length;
}
private void fill(int c, int[] array) {
if (c < array.length) {
while (c < array.length) {
result[current++] = array[c++];
}
}
}
}
Mi pare che funzioni |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jun 2007
Messaggi: 1232
|
Ragazzi credo che gli esercizi servono a far lavorare un pò la testa , a che serve utilizzare delle funzioni predefinite??
__________________
Cpu: Amd 64 X2 5200+ - Mobo:M2N32SLI DELUXE - Ram: Corsair xms2 800 mhz kit 4gb - SK Video: Gaiward GTS250 - Ali : Enermax Liberty 500 Wat - Mast DVD: 2 Nec AD-5170A - Case : Thermaltake Armor+ - Dissipatore: Thermaltake V1 Notebook: Sony Vaio VGN-Fe21M-Pda: Htc Diamond |Il mio sito|Flickr| Stanco del solito forum? Vieni a parlare di fotografia su Fotoni |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:35.










del tipo primo array {9,8,7} e secondo array {6,5,4} il nuovo vettore che mi mostra è {9,8,7,0,4,0}
quindi vorrei limitare al solo apprendimento di un algoritmo di ordinazione










