BromsMedlem sedan sep. 2002188 inlägg kan man öka längden på en redan befintlig array skapad genom
int Tal[] = new int[10];
utan att ta bort de värden som redan lagt till i denna.. alltså till exempel i en while-sats öka längden på arrayen med 1 varje gång satsen är true, kan ju vara smidigt om man vill ha ett program vid liv så länge programmet tar emot värden skiljda från 0, och man inte vill ge arrayen 1000.. platser från början..
ViktorMedlem sedan aug. 20021 752 inlägg Nej, du kan inte utöka en array och samtidigt ha värdena kvar i den utan antingen skapar du en ny längre och kopierar över värdena eller (rekomenderas starkt) använder du en List istället som är en dynamisk lista som utökas efter behov.
List myList=new ArrayList();
myList.add("Kalle");
myList.add("Anka");
myList.add("Dalle");
Iterator iter=myList.iterator();
while(iter.hasNext())
{
System.out.println(iter.next());
}
Den tar mer resurser än en array men behöver du en dynamisk array så är det bästa vägen att gå :)
/Viktor
BromsMedlem sedan sep. 2002188 inlägg jag tänkte på det första alternativet du skrev, att man kopierar över värdena till en ny array, och skapar om array 1 med 1 extra plats, kopierar tillbaks värdena och läser in nästa tal.. hur görs detta enklast? Har suttit och testat allt möjligt nu..hjälp?
Programmet nedan skall läsa in nya värden ända tills 0 matas in, och ange om talet är jämnt eller ojämnt, samt om det är positivt eller negativt.. anledningen till att jag kör med en array är att jag vill kunna plocka ut värdena efteråt, och beräkna summan av alla talen etc etc.. den klagar hela tiden på raderna typ charINFO_2='jamnt';.. hur fixas det till? Och hur fixar man det där jag beskrev ovan, men en extra array som temporär plats att spara värdena i?
import extra.*;
public class Lab2_7b {
public static void main (String[] arg) {
int i=0;
char charINFO_1[] = new char[10]; //positivt? negativt?
char charINFO_2[] = new char[10]; //ojämnt? jämnt?
int intTal[] = new int[2];
int intTal2[] = new int[2];
Std.out.print(hejsan + " är början på alfabetet");
while(i<a && intTal[i-1]!=0){
Std.out.print("Skriv in ett heltal, avsluta med 0: ");
intTal*= Std.in.readInt();
if (intTal>0){
charINFO_1='positivt';
if (intTal%2==0)
charINFO_2='jamnt';
else
charINFO_2='ojamnt';
}
else{
charINFO_1='negativt';
if (intTal%2==0)
charINFO_2='jamnt';
else
charINFO_2='ojamnt';
Std.out.print(intTal + " är ett" + charINFO_1 + " och " + charINFO_2 + " tal.");
}
}
}*
Mc FettoMedlem sedan nov. 20022 355 inlägg Du kan med lätthet ta ut värdena ur en List och göra beräkningar. Är det en skoluppgift är det kanske ifs så att du måste använda dig av en vanlig vektor!?
BromsMedlem sedan sep. 2002188 inlägg Det var inte tänkt att man skulle använda sig av arrayer, eftersom det i uppgiften inte sägs att värdena skall finnas kvar efter att utskriften är gjord, jag gjorde programmet med en vanlig integer från början, men sedan hade jag tråkigt och ville göra om det så att programmet blev mer användbart, och där man slipper ange arrayens längd till 1000 från början för att vara säker på att användaren inte matar in fler värden än arrayen klarar av..
Problemet med klagomålen på charINFO_2='jamnt'; kvarstår dock..
ViktorMedlem sedan aug. 20021 752 inlägg Först, Använd [kod_] taggar (utan _), blir lättar att följa koden då :)
Att den klagar beror på att du har deklarerat en array av char men försöker lägga in en sträng. Antingen får du byta från char arrayer till strängar
String stringINFO_1=null;
String stringINFO_2=null;
...
stringINFO_1="negativt";
stringINFO_2="jamnt";
eller kopiera in bokstav för bokstav in i arrayen men det tror jag inte din lärare godkänner :)
Att kopiera värden från en array till en annan är inte så svårt, allt som behövs är en vanlig for loop, du ska loopa lika många gånger som det finns element i den gamla arrayen, typ såhär,
int i=0;
int intTal2[] = new int[2];
intTal2[0]=1;
intTal2[1]=2;
//nu blir det problem, måste ha en plats till!
int tmpTal[]=new int[intTal2.length+1];
for(i=0;i<intTal2.length;i++)
{
tmpTal[i]=intTal2[i];
}
//nu finns samma ska i tmpTal som i intTal2,
//men tmpTal har ett ledigt element.
//nu ska allt över till intTal2 igen,
intTal2=new int[tmpTal.length];
for(i=0;i<intTal2.length;i++)
{
intTal2[i]=tmpTal[i];
}
//klart!
/Viktor
BromsMedlem sedan sep. 2002188 inlägg Sure.. ska köra så i fortsättningen.. :p Jag får det dock fortfarande inte att fungera, nu klagar JCreator även på att % inte kan användas för int[],int..
import extra.*;
public class Lab2_7b {
public static void main (String[] arg) {
int i=0;
int intTal[] = new int[2];
intTal[0]=1;
intTal[1]=2;
String stringINFO_1=null; //positivt? negativt?
String stringINFO_2=null; //ojämnt? jämnt?
Std.out.print(hejsan + " är början på alfabetet");
while(intTal[i-1]!=0){
Std.out.print("Skriv in ett heltal, avsluta med 0: ");
intTal[i]= Std.in.readInt();
int tmpTal[]=new int[intTal.length+1];
for(i=0;i<intTal.length;i++){
tmpTal[i]=intTal[i];
}
intTal=new int[tmpTal.length];
for(i=0;i<intTal.length;i++){
intTal[i]=tmpTal[i];
}
if (intTal>0){
stringINFO_1="positivt";
if (intTal%2==0)
stringINFO_2="jamnt";
else
stringINFO_2="ojamnt";
}
else{
stringINFO_1="negativt";
if (intTal%2==0)
stringINFO_2="jamnt";
else
stringINFO_2="ojamnt";
}
Std.out.print(" är ett" + stringINFO_1 + " och " + stringINFO_2 + " tal.");
}
}
}
ViktorMedlem sedan aug. 20021 752 inlägg En variabel av typen int kan bara innehålla siffror, 0-9, och tal från -2 147 483 648 till +2 147 483 647. % är inte en siffra utan ett tecken, den kan du spara i en char eller string variabel.
/Viktor
BromsMedlem sedan sep. 2002188 inlägg jo så långt vet jag :p jag menade bara att jcreator klagade på att jag körde % operationen på ett int-tal, men det var för att jag glömde peka på vilken plats i arrayen som jag syftade på.. skrev bara intTal och inte intTal som det skulle stå... *psst hade lite gammal fulkod från tidigare felsökningar kvar också, men nu är den borta.. *Nu får jag inga fler errors tills jag kör programmet.. då står det:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at Lab2_7b.main(Lab2_7b.java:14)
*funderar*
import extra.*;
public class Lab2_7b {
public static void main (String[] arg) {
int i=0;
int intTal[] = new int[2];
intTal[0]=1;
intTal[1]=2;
String stringINFO_1=null; //positivt? negativt?
String stringINFO_2=null; //ojämnt? jämnt?
while(intTal[i-1]!=0){
Std.out.print("Skriv in ett heltal, avsluta med 0: ");
intTal[i]= Std.in.readInt();
if (intTal[i]>0){
stringINFO_1="positivt";
if (intTal[i]%2==0)
stringINFO_2="jamnt";
else
stringINFO_2="ojamnt";
}
else{
stringINFO_1="negativt";
if (intTal[i]%2==0)
stringINFO_2="jamnt";
else
stringINFO_2="ojamnt";
}
int tmpTal[]=new int[intTal.length+1];
for(i=0;i<intTal.length;i++){
tmpTal[i]=intTal[i];
}
intTal=new int[tmpTal.length];
for(i=0;i<intTal.length;i++){
intTal[i]=tmpTal[i];
}
Std.out.print(" är ett" + stringINFO_1 + " och " + stringINFO_2 + " tal.");
}
}
}
BromsMedlem sedan sep. 2002188 inlägg okej, dum jag var.. satte i till 2 från början nu.. men det blir fortfarande errors...
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at Lab2_7b.main(Lab2_7b.java:17)
Mc FettoMedlem sedan nov. 20022 355 inlägg Du kommer fortfarande utanför arrayn, kör med for() och array.length
r: så som viktor gjorde i sitt exempel ovan..
for(i=0;i<intTal2.length;i++)
Så slipper du hamna utanför!
BromsMedlem sedan sep. 2002188 inlägg jag gör ju det :p
Nu lyckades jag fixa det i alla fall, lade till variabeln b för att komma in på rätt plats i arrayen på varv 1 genom att ändra i´s värde då b=0, dvs bara första varvet...
import extra.*;
public class Lab2_7b {
public static void main (String[] arg) {
int i=1,j=0,b=0,intSum=0,intMin=0,intMax=0;
int intTal[] = new int[1];
intTal[0]=1;
String stringINFO_1=null; //positivt? negativt?
String stringINFO_2=null; //ojämnt? jämnt?
while(intTal[i-1]!=0){
if(b==0){
i=0;
b=1;
}
Std.out.print("Skriv in ett heltal, avsluta med 0: ");
intTal[i]= Std.in.readInt();
if (intTal[i]>0){
stringINFO_1="positivt";
if (intTal[i]%2==0)
stringINFO_2="jamnt";
else
stringINFO_2="ojamnt";
}
else{
stringINFO_1="negativt";
if (intTal[i]%2==0)
stringINFO_2="jamnt";
else
stringINFO_2="ojamnt";
}
int tmpTal[]=new int[intTal.length+1];
for(j=0;j<intTal.length;j++){
tmpTal[j]=intTal[j];
}
intTal=new int[tmpTal.length];
for(j=0;j<intTal.length;j++){
intTal[j]=tmpTal[j];
}
//Min-värde
if(intTal[i]<intMin)
intMin=intTal[i];
//Max-värde
if(intTal[i]>intMax)
intMax=intTal[i];
//Summa
intSum+=intTal[i];
//Info
if (intTal[i]!=0){
Std.out.println(intTal[i] + " är ett " + stringINFO_1 + " och " + stringINFO_2 + " tal.");
i++;
}
//Avslut + info
else{
Std.out.println("0 matades in, programmet avslutas");
Std.out.println(i + " st tal i intervallet[" + intMin + "," + intMax + "] matades in, med summan " + intSum);
}
}
}
}
Nu fungerar allt som det skall, tack så mycket för hjälpen Viktor =)
MMXoaqMedlem sedan apr. 200228 inlägg int tmpTal[]=new int[intTal.length+1];
for(j=0;j<intTal.length;j++){
tmpTal[j]=intTal[j];
}
intTal=new int[tmpTal.length];
for(j=0;j<intTal.length;j++){
intTal[j]=tmpTal[j];
}
Detta känns lite onödigt varför kopiera arrayen två gånger? inte direkt effektivt. Sen kan du ju fundera på om det är värt att förlänga arrayen vid varje inmatning. Öka den exempelvis med dubbla längden hela tiden. Du kommer då få en mer effektiv metod ;>
int tmpTal[]=new int[intTal.length+1];
for(j=0;j<intTal.length;j++){
tmpTal[j]=intTal[j];
}
intTal = tmpTal;
Detta verkar lite bättre ;)
jonnyzMedlem sedan okt. 2004502 inlägg Om jag inte minns fel så behövs inte den första loopen eftersom det går att kopiera hela vektorer om de är lika stora.
int tmpTal[]=new int[intTal.length+1];
tmpTal=intTal;
inTal=new int[tmpTal.length];
for(j=0;j<intTal.length;j++){
intTal[j]=tmpTal[j];
}
MMXoaqMedlem sedan apr. 200228 inlägg Det jag antar att du menar kommer innebära att båda referneserna kommer peka på samma objekt med exakt samma längd.
1. Du skapar objektet tmpTal som skall innehålla intTals length + 1 tal.
2. Sen tilldelar du intTals refernes till tmpTal detta kommer innebära att tmpTal nu kommer peka på samma objekt som intTal
Vilket innebär att det kommer vara samma objekt och ingen längdförändring kommer att ske
int tmpTal[]=new int[intTal.length+1];
tmpTal=intTal;
:P
jonnyzMedlem sedan okt. 2004502 inlägg Man ska visst inte skriva sådant här mitt i natten.
Jag brukar göra tvärtom själv nämligen.
int tmpTal[]=new int[intTal.length];
tmpTal=intTal;
intTal[]=new int[intTmp.length+1];
for (int i=0; i<intTmp.length; i++)
intTal[i]=intTmp[i];
Därefter finns det en "ledig plats" i intTal att slänga in det nya värdet i.
MMXoaqMedlem sedan apr. 200228 inlägg Oki det där var ungefär vad jag skrev innan men det finns ingen möjlighet att komma ifrån en for loop men man kan ju annars bara använda javas standardbibliotek System.arraycopy(...)
så slipper man garanterat alla buggar, Själv tycker jag att man försöka att återanvända så mycket som möjligt när nu java har en så bra api ;>
Mc FettoMedlem sedan nov. 20022 355 inlägg
MMXoaq skrev:
Oki det där var ungefär vad jag skrev innan men det finns ingen möjlighet att komma ifrån en for loop men man kan ju annars bara använda javas standardbibliotek System.arraycopy(...)
så slipper man garanterat alla buggar, Själv tycker jag att man försöka att återanvända så mycket som möjligt när nu java har en så bra api ;>
Om man nu vill göra det enkelt för sig så är det enklaste att använda sig av ArrayList ;)