Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

Java - Array


sigisMoNd

Öne çıkan mesajlar

javada array kullanarak bir diziyi tersten nasil yazabilirim?

asagida denedim ancak hata verdi cmd de. hata olarak scanner icin cannot find symbol yaziyor. bir de a.length() kisimlari icin yine cannot find symbol yaziyor. su scanner i dogru yere koyamadim sanirim. denedim ama cozemedim. a.length() i neden bulamiyor onu da anlamadim.

edit: uzerinde biraz daha oynadim. artik bu hatayi aliyorum:

non-static variable sc cannot be referenced from a static context

length hatasi hala ayni duruyor.




said:

import java.util.*;

public class Array1 {
Scanner sc = new Scanner (System.in);
static void invert (int[]a) {

for (int i=a.length()-1; i>=0; i--) {
System.out.println(a[i] + " ");
}

}

static int[] readArray () {

int len = sc.nextInt();
int[]a = new int[len];
for (int i=0; i<len; i++) {
a[i] = sc.nextInt();
return a;
}
}

static void printArray (int[] a) {
for (int i=0; i<a.length(); i++) {
System.out.println(a[i] + " ");
}
}

public static void main (String[]args) {
//Scanner sc = new Scanner (System.in);
int[]a = readArray();
printArray(a);
invert(a);
printArray(a);
}
}
Link to comment
Sosyal ağlarda paylaş

ilk olarak sen sen ol array donduren fonksiyon yazmaktan kacin. onun yerine bi array alip bunu modifiye edicek bi fonksiyon yaz
ornegin alttaki ornek icin

int[] fonksiyon()

yerine

void fonksiyon(int [])

yap, sonra cagirirken arrayi initialize edip cagirirsin.


Hatan su, readArray fonksiyonunda kullandigin sc global olarak define edilmemis oldugundan, define etmeden bi variable kullaniyosun orda, cunku sc denen seyi baska bi fonksiyonda define edip initialize ettin, local bi variable kisaca.

Yapman gereken, ya yeni bi field eklemek Scanner icin, ya da Scanner'i readArray'de declare etmek, ki ikincisi mantiklisi.
Scanner sc = new Scanner (System.in);
satirini main'den silip readArray'in basina al


length'i bulamamasinin sebebi de length'in fonksiyon degil field olmasi Java Array objesinde.
a.length diye alicaksin () olmadan.

diger hatalari da kodun uzerine yaziyorum comment olarak

sigisMoNd said:
javada array kullanarak bir diziyi tersten nasil yazabilirim?

asagida denedim ancak hata verdi cmd de. hata olarak scanner icin cannot find symbol yaziyor. bir de a.length() kisimlari icin yine cannot find symbol yaziyor. su scanner i dogru yere koyamadim sanirim. denedim ama cozemedim. a.length() i neden bulamiyor onu da anlamadim.


said:

public class Array1 {

// invert etmiyo bu fonksiyon, inverted sekilde basiyo ekrana, printInverted falan gibi bi isim daha dogru olur
static void invert (int[]a) {

for (int i=a.length()-1; i>=0; i--) {
System.out.println(a[i] + " " );
}

}

static int[] readArray () {
// Scanner sc = new Scanner(System.in) burda olcak
int len = sc.nextInt();
int[]a = new int[len];
for (int i=0; i<len; i++) {
a[i] = sc.nextInt();

//bu yanlis, her eleman icin donguyu tamamlayip
// arrayi doldurup, ondan sonra dondureceksin a yi
return a;
}
// return a burada olacak
}

static void printArray (int[] a) {
for (int i=0; i<a.length(); i++) {
System.out.println(a[i] + " " );
}
}

public static void main (String[]args) {
// bu alttaki scanner satirini kaldir
Scanner sc = new Scanner (System.in);
int[]a = readArray();
printArray(a);
invert(a);
}
}

Link to comment
Sosyal ağlarda paylaş

Penthesilea said:
ilk olarak sen sen ol array donduren fonksiyon yazmaktan kacin. onun yerine bi array alip bunu modifiye edicek bi fonksiyon yaz
ornegin alttaki ornek icin

int[] fonksiyon()

yerine

void fonksiyon(int [])

yap, sonra cagirirken arrayi initialize edip cagirirsin.



burada modifiye etmek icin invert i yazdim. o da zaten void invert (int []) tam anlayamadim burada demek istedigini.

edit: simdi commentleri okiyim. yeni gordum editledigini
Link to comment
Sosyal ağlarda paylaş

aciklamayi baya kotu yapmisim sc icin, saatin de sabah 7 olmasi ve hala yatmamis olmam etkisiyle :)

Bir braket { } icinde bisey declare edersen Object x; seklinde, bu declaration sadece o braketler icinde gecerli olur, local bi variable'dir.

O yuzden sen gidip main'de declare ettigin bir variable'i baska fonksiyonda kullanamazsin. Ya o fonksiyonda kullanmadan once yaratacaksin, ya da bu variable global bi variable olacak, fonksiyonlarin disinda declare edeceksin yani. senin sorununu yukarida soyledigim olay basitce cozuyo ama.
Link to comment
Sosyal ağlarda paylaş

en son su hale getirdim ama hala hata aliyorum length konusunda
said:

import java.util.*;

public class Array1 {

static void invert (int[] a) {
int i = 0;
int j = a.length - 1;
while (i < j) {
int h = a[i];
a[i] = a[j];
a[j] = h;
i++;
j--;
}
}

static int[] readArray () {
Scanner sc = new Scanner (System.in);
int len = sc.nextInt();
int[]a = new int[len];
for (int i=0; i<len; i++) {
a[i] = sc.nextInt();

}
return a;
}

static void printArray (int[] a) {
for (int i=0; i<a.length; i++) { //hata burada
System.out.println(a[i] + " " );
}
}

public static void main (String[]args) {

int[]a = readArray();
printArray(a);
invert(a);
}
}



pardon yaticakmisin :) iyi uykular o zaman

edit 324234: calisan hali
Link to comment
Sosyal ağlarda paylaş

hah invert simdi invert olmus iste :)

abi a.length() leri a.length yaparsak sorunun cozulecek yukarda da dedigim gibi, Java'da length bi fonksiyon degil, bi field. () lari kaldi yani length'in sonundan

calismasi lazim ondan sonra hata gormuyorum ben, println leri de bi ust posttaki gibi duzeltirsen programi calistirdiktan sonra of yanlis basmisim diye duzeltmene gerek kalmicak :)
Link to comment
Sosyal ağlarda paylaş

Pratik bilgiler: Konsola array yazdırmak için Arrays API'si:

System.out.println(Arrays.toString(a));


Ayrıca index'ler üzerinde çalışmıyorsanız Java 1.5'de eklenen foreach döngüsünü kullanmanızı şiddetle tavsiye ederim. Hem yazması kolay, hem okuması. Hata şansınız da daha az.

for (int i = 0; i < a.length; i++) {
syso(a[i]);
}

yerine

for (int n : a) {
syso(n);
}

Okunuşu: a içindeki (int tipindeki) her n için { ... }
a array'inin en başından başlayıp sırayla tüm elemanlar için dönüyor yani. Ayrıca sadece array için değil, bütün Iterable'lar için kullanılabiliyor.

Dipnot: i değişkeni index anlamında kullanıldığı için foreach kullanırken i kullanmaktan kaçının. Çünkü burda i index değil, integer. En ideali anlaşılabilir tam bir kelime kullanmak. Ama tabi yerine göre n, m gibi değişken isimleri de yeterli olabilir. Metod kısaysa özellikle.
Link to comment
Sosyal ağlarda paylaş

@Mirage: baya pratik gozukuyor gercekten

benim baska bir sorum olucak. simdi amac verilen quadrat matrixte ana diagonalde (almancada hauptdiagonal diye geciyor ondan oyle dedim) spiegelung(yansima denilebilir sanirim) yapilacak. simdi ornek vericem o zaman anlarsiniz:

mesela


2 0 0 0 2 7 6 3
7 8 0 0 --- 0 8 5 1
6 5 6 0 ---/ 0 0 6 7
3 1 7 5 0 0 0 5

said:

import java.util.*;

public class Array3 {

static int[][] readArrayMatrix () {
Scanner sc = new Scanner (System.in);
int len = sc.nextInt();
int[][]a = new int[len][len];
for (int i=0; i<len; i++) {
for (int j=0; j<len; j++) {
a[i][j] = sc.nextInt();
}
}
return a;
}

static void printMatrix (int[][]a) {
for (int i=0; i<a.length; i++) {
for (int j=0; j<a.length; j++) {
System.out.print(a[i][j] + " " );
}
} System.out.println();

}

static void transpose (int[][]a) {
for (int i=0; i<a.length; i++) {
for (int j=0; j<a.length; j++) {
int h = a[i][j];
a[i][j] = a[j][i];
a[j][i] = h;

} System.out.println();
}
}

public static void main (String[]args) {
int[][]a = readArrayMatrix();
//printMatrix(a);
transpose(a);
printMatrix(a);
}
}



benimkinde ayni kaliyor nedense. yazdigim transpose metodu mantikli gelmisti.
Link to comment
Sosyal ağlarda paylaş

Bu arada sey, printmatrix'inde endline'i koydugun yer yanlis zaten calistirirsan farketmissindir, bi de transpose komutunda gereksiz bi endline basiyosun.

Bu arada Mum'un dedigi gibi arrays.tostring'i kullanman baya kolaylastirir isini. matrixlerde falan da kullanabilirsin.

ikinci dedigi islemi yapman icin ama, arrayinde bi obje tasiyor olman gerekli. int yerine Integer tasiman lazim yani. Gerci otomatik cast ediyor olmasi lazim int'i Integer'a, ama gerek yok boyle bi ornekte.
bu olmaz yani,

for (int n : a) {
syso(n);
}

boyle yapman lazim

for(Integer n : a) {
System.....(a);
}



arrays to string'i matrixlerde boyle kullanabilirsin

for(int i=0; i<a.length; i++) {
System.out.println(Arrays.toString(a[i]);
}


a[i][j] ye mesela elementlerimiz, a[i] burada bir rowu temsil ediyor yani, e matrix de her rowu bir array olan bi dalga sonucta.
Link to comment
Sosyal ağlarda paylaş

Abi ben bunu kullanamadigimi adim gibi hatirliyorum ya

Derken tamam neden oyle bisey dusundugumu hatirladim. Kodlarimda arrayden ziyade Map, Set falan kullandigimdan, ve bunlar primitif type tasimadigindan kullanamiyordum, taslar yerine oturdu :) for each'in sucu yokmus ehue.

6 yazmisim evet 5 olacak, 6 zaten hala guncel surum di mi? Ben ilk 2007 yazinda ogrenip asik olmustum :)
Link to comment
Sosyal ağlarda paylaş

tekrar selam!

2 sorum var. 1.si asagida yazdigim kodla ilgili.

input: mesela


5 //n-n matrix icin n degeri

23 4 54 7 8 9 5 4 1 //bunlar da bu matrixe yerlestirilecek
//sayilar. satir satir yerlestirilecek
//ama sutun halinde yazilmis halinde
//ekrana verilecek. bos olan hucreler de 0
//ile doldurulacak

23 9 0 0 0
4 5 0 0 0
54 4 0 0 0 ===> boyle yani
7 1 0 0 0
8 0 0 0 0



benim yazdigim programda ilk ve son sayilar matrixe eklenmiyor nedense. cozemedim.

2. sorum da for-each ile ilgili. asagidakinde mesela

for (int j=0; j<n; j++) {
for (int i=0; i<n; i++) {
System.out.print(a[i][j] + " " );
}


su kisimdaki kullanimi mumkun mudur? 2 boyutlu oldugu icin burada cozemedim o olayi. mumkunse nasil yapilir?

said:

import java.util.*;

class Array5 {
public static void main (String[]args) {
Scanner sc = new Scanner (System.in);
int n= sc.nextInt();
byte[][] a = new byte[n][n];
byte val = (byte)sc.nextInt();
while (sc.hasNextInt()) {
// fill the matrix row by row
val = (byte)sc.nextInt();
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
if (sc.hasNextInt()) {
a[i][j] = val;
val = (byte)sc.nextInt();
} else { a[i][j] = 0; }
}
}
// write the matrix column by column
for (int j=0; j<n; j++) {
for (int i=0; i<n; i++) {
System.out.print(a[i][j] + " " );
}
}
}
}
}

Link to comment
Sosyal ağlarda paylaş

For-each sadece okuma amaçlı kullanılıyor. Index kullanarak array'e atama yaptığın için uymuyor bu duruma.

val değişkenini kaldırırsan düzelir sorun sanırım. İlk başta val değişkenine atama yaparken fazladan nextInt kullandığın için ilk input boşa gidiyor. Dolayısıyla da son elemana geldiğin zaman başlangıçta boş yere okuduğun int yüzünden okunacak int kalmamış oluyor.

said:

import java.util.*;

class Array5 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
byte[][] a = new byte[n][n];
while (sc.hasNextInt()) {
// fill the matrix row by row
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (sc.hasNextInt()) {
a[i][j] = (byte) sc.nextInt();
} else {
a[i][j] = 0;
}
}
}
// write the matrix column by column
for (int j = 0; j < n; j++) {
for (int i = 0; i < n; i++) {
System.out.print(a[i][j] + " ");
}
}
}
}
}


Edit: Matrixteki sütunları yatay olarak yazdırcak olsan for-each kullanabilirdin. Matrix'i transpoze etmiş gibi yazdırır ama:

said:

for (byte[] column : a) {
System.out.println(Arrays.toString(column));
}
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...