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

yine birsey takildi aklima.

simdi mesela herhangi bir stringi input olarak giricez. scanner kullanmak lazim. ancak bu girilen string uzerinde stringbufferda kullanilan string.delete(), string.append(), string.substring() gibi hazir metodlari nasil kullanabiliriz? mumkun mudur?


Scanner sc = new Scanner (System.in);

StringBuffer string = new StringBuffer();

string = sc.next();


anlatabilmisimdir umarim. boyle birsey denedigimde incompatible types diye hata aliyorum stringbuffer olarak seyi scannerla okumaya calistigim zaman.

yani mesela girilen string input uzerinde stringbuffer metodlarini uygulamak istiyorum.
Link to comment
Sosyal ağlarda paylaş

StringBuffer ile String aynı şey değil. O yüzden StringBuffer türünden tanımladığın değişkenin ismini "string" yapma, kafanı karıştırır iyice.

Scanner.next() sana bir string veriyor. Bu verilen string'i buffer'ın sonuna eklemek istersen StringBuffer.append(String) kullanabilirsin.
Link to comment
Sosyal ağlarda paylaş

selam tekrar

asagidaki daha onceden yapicam dedigim baklava desenli halinin kodu :d

. . x . .
. x . x .
x . . . x
. x . x .
. . x . .


bunun kodu baya uzun geldi. KISS principle uygun olarak daha kisasini yapmak mumkun mudur bunun?

bir de char scan ederken ben once String okutup oradaki ilk chari aldim haliya "." disindaki simgeleri koymak icin. bunun daha cillop bir hali var midir?


import java.util.*;

class Tepich {
public static void main (String[]args) {
Scanner sc = new Scanner (System.in);
int n = sc.nextInt();
String str = sc.next();
char ch = str.charAt(0);
int middle = n/2;

for (int y=0; y<=middle; y++) {
for (int x=0; x<=n; x++) {
if (x == middle-y ) {
int c = x+y;
if (x<=c+y) {
System.out.print(ch);
x++;
}
}
else if (x == middle+y+1) {
int d = x+y;
if (x==n) {
System.out.print(ch);
}
else if (x<=d+y) {
System.out.print(ch + "." );
x++;
}
}
else {
System.out.print("." );
}
} System.out.println();
}

for (int y=1; y<=middle; y++) {
for (int x=0; x<=n; x++) {

if (x == y) {
if (x>=y) {
System.out.print(ch);
x++;
}
} else if (x==n-y) {
if (x>=y) {
System.out.print(ch + "." );
x++;
}
}
else {
System.out.print("." );
}
} System.out.println();
}

}
}
Link to comment
Sosyal ağlarda paylaş

  • 4 hafta sonra ...
yine birkac tane sorum olucak.


...

private int[] arr = new int[3];
private int curIndex = 0;
private static int GROW_SIZE = 3;

...

public void increaseSize()
{
arr = Arrays.copyOf(arr, arr.length + GROW_SIZE);
}

public String toString()
{
return Arrays.toString(Arrays.copyOf(arr, curIndex));
}



Arrays.copyOf u tam olarak anlayamadim. bu hazir sunulmus birsey sanirsam. Array.copyOf(hangi array kopyalanicaksa onun ismi, kopyalarkenki genisletilme miktari) gibi birsey mi? aydinlatirsaniz sevinirim.

edit: tam kodu da veriyim baska bir sorum daha olucak cunku



import java.util.*;

public class IntCollection
{
private int[] arr = new int[3];
private int curIndex = 0;
private static int GROW_SIZE = 3;

public void add(int value)
{
if(curIndex>=arr.length) {
increaseSize();
}
arr[curIndex] = value;
++curIndex;
}

public void add(int value, int pos)
{
while(pos >= arr.length) {
increaseSize();
}
arr[pos] = value;

curIndex = Math.max(pos+1, curIndex);
}

public void increaseSize()
{
arr = Arrays.copyOf(arr, arr.length + GROW_SIZE);
}

public String toString()
{
return Arrays.toString(Arrays.copyOf(arr, curIndex));
}
}




array size'i increase etmek icin arr.length i 2 ile carptim bu hatayi aldim:

.IntCollection.java:30: cannot assign a value to final variable length
arr.length += GROW_SIZE;

bir de add(int value) metodundaki if i while ile degistirdim kucuk geldikce 2 ile carpsin diye ama yukardaki hata yuzunden olmadi tabi.
Link to comment
Sosyal ağlarda paylaş

Array.length property'sine bir değer "set" edemezsin. sadece "get" edip değeri okuyabilirsin. o yüzden kızmış.

copyto metodu da o yüzden var zaten. bir array'in uzunluğunu doğrudan değiştiremediğin için, yeni bir aray kopyası yaratıp, yatırken de uzunluğunu arttırıyor.

java bilmiyorum ama durum budur gibi görünüyor.
Link to comment
Sosyal ağlarda paylaş

Şimciiii... increaseSize metodunun private olması daha mantıklı olur bence. Sadece senin intern olarak array boyutunu ayarlamak için kullandığın bir metoda benziyor.

İlk önce add(int value, int pos) metodunun gerçekten doğru işi yaptığından emin ol. Java API'deki collection'larda var olmayan bir index'e bir eleman eklemeyezsin. Mesela boyutu 2 olan bir listede add(e, 4) çağırırsan IndexOutOfBoundException alırsın. Bakınız: java.util.ArrayList

Tabi kendi yapacağın collection'da böyle olmak zorunda değil (ama ne kadar mantıklı tartışılır, aradaki bütün elemanlar boş kalacak). Boyutu otomatik arttırmak istiyorsan şunu göz önünde bulundur: Arrays.copyOf biraz pahalı bir metod. Her çağırdığında bellekte yeni bir array için yer ayırıp içeriği kopyalıyorsun.

public void add(int value, int pos)
{
while(pos >= arr.length) {
increaseSize();
}
arr[pos] = value;

curIndex = Math.max(pos+1, curIndex);
}

Yukardaki while döngüsünde yüksek bir pos verilmişse, o pos değerine erişene kadar binlerce yeni array için yer ayırıp kopyalaman gerekebilir. O yüzden döngü içinde increaseSize metodunu çağırmak yerine tek celsede istediğin boyuta büyütebilirsin array'i.
Link to comment
Sosyal ağlarda paylaş

  • 2 hafta sonra ...
konunun amaci (basliga bakildiginda) biraz sapti ama burdan sormaya devam ediyim javayla ilgili.

simdi bu interfacelerde amaci tam olarak anlayamadim. birkac class in ortak metodlarini metodlarin ici olmadan interface olarak yaziyoruz bu ortak kullanim alani gibi birsey oluyor tamam da interface olmasa da ayni isi gormezler mi?

yani ne biliyim zaten interface te yazili olan butun metodlar subclass larda var. kullanilmasinin tek amaci bu classlarda metod isimlerinin tamamen ayni olmasi midir nedir? gerci bu kez kontruktor ve diger bazi metodlarda parameter farki meydana cikiyor. biri aydinlatirsa sevinirim.
Link to comment
Sosyal ağlarda paylaş

Değişik kullanım alanları var. Anlatması zor biraz. Kodun anlaşılmasını arttırdığı için kullanılabiliyor, tasarım sırasında verilen kararların koda yansımasını belirginleştiriyor ve belki de en önemlisi inheritance kullanmadan soyutlaştırma sağlıyor. Bir class'a ait birden fazla özelliği interface'ler aracılığı ile belirtebiliyorsun.

Diyelim bir oyun yazmaya karar verdin. Dragon ve Horse diye iki sınıf tanımladın. Yeni inheritance öğrenmişsin, kesinlikle kullanmalıyım dedin ve Animal diye bir üst sınıf tanımladın. Sonra aklına geldi, oyunda hayvanları evcilleştirebilelim dedin ve tame(target) diye bir metod eklemek istedin. Sorun ise: target parametresinin tipi ne olmalı?

Zaten inheritance kullandığın için evcilleştiribilecek hayvanlara bir üst sınıf tanımlaman mümkün değil. Ama kalkıp Tameable diye bir interface tanımlarsın. Evcilleştiribilecek her sınıfın bu interface'i kullanmasını zorunlu tutarsın, böylece belli metodları da tanımlamak zorunda kalırlar. Sonra herhangi bir yerde tame(Tameable t) diye tanımlayarak verilen parametrenin gereksiz her özelliğini soyutlamış olursun. Senin ihtiyacın olan sadece Tameable arayüzündeki metodlar. tame metoduna verilen argüman hangi sınıftan olduğunun bir önemi yok.

Başka bir örnek de Java Collections API'sinden vereyim. List interface'ini biliyorsundur. add, addAll, get, subList gibi metod signature'ları tanımlanmış. Bu arayüzü alan her liste bu metodları tanımlamak zorunda. Sen listeleri sıralayan bir metod yazmak istiyorsun diyelim. Sıralamayı yapabilmen için gereken tek şey verilen elemanın bir liste olması.

imbaSort(List list)

diye tanımladın. Verilen eleman ArrayList olabilir, Vector olabilir, hatta başkabirinin tanımladığı list implement eden HedoHodo diye bir sınıf olabilir. Seni ilgilendiren tek şey List arayüzünü sana sağlaması. Geri kalan her şeyi soyutlamış oluyorsun. imbaSort metodunun içinde sadece senin ihtiyacın olan metodlara erişimin oluyor.
Link to comment
Sosyal ağlarda paylaş

yani inheritance kullanmadigimiz zaman interface in bir onemi kalmiyor?

mesela ornegin 2 tane class yarattik. biri quadrat biri kreis olsun. simdi bu iki class in da benzer metodlari var diyelim.



public class Kreis {
private double radius;

// Konstruktor..

getArea() { ... }
getPerimeter() { ... }

...

------------------------------

public class Quadrat {
private double a;

// Konstruktor..

getArea() { ... }
getPerimeter() { ... }

...


bir de main programimiz var bu iki class in cagirildigi.

bu iki class'in sadece ortak metodlari var diye ayrica bir de


public interface Base {
double getArea();
double getPerimeter();
}


gibi bir interface yazmaya gerek var mi? yanlis anlamadiysam bu durumda yok.

ama mesela bu ikisinin yanina bir de Ellipse diye yeni class yaratsaydik. Kreis da Ellipse e extend etseydi ama ayni zamanda Kreis ve Quadrat olup da Ellipse de olmayan bir metod olsaydi. simdi bu Ellipse de olmayan metod icin Kreis ve Quadrat in implement ettigi bu metodu iceren bir interface mi yazmamiz gerekirdi? dogru mu anlamisim?

biraz karisik oldu sanki anlatim. anlatabilmisimdir umarim.
Link to comment
Sosyal ağlarda paylaş

Inheritance yoksa interface'in önemi yok diyemeyiz. Bazı durumlarda inheritance mı kullanmak lazım interface mi tartışılır. "xx şeklinde bir interface yazmaya gerek var mi?" tarzı sorularına gelince... bütün ortak metodlar interface olarak çıkartılmalı diye bir gereklilik yok. Verdiğin örneklerde inheritance ile bir class hierarşisi de kurabilirsin, çünkü belirgin bir "is a" ilişkisi var.

Interface önemi özellikle program büyüdükçe ve projedeki kişi sayısı arttıkça artıyor. Diyelim bir metod yazıyorsun, metodunun parametresi için belli özelliklere sahip bir tipe ihtiyacın var. İhtiyacın olan metodları bir interface olarak yazarsın, metodların yapması gereken şeyler için de bir döküman hazırlarsın. Sonra da metodunu bu interface'i kullanarak tanımlarsın. Bu interface'i bir anlaşma ya da bir spesifikasyon olarak da düşünebilirsin. O interface'i başkasına verip "bana buna uyan bir class yaz" diyebilirsin.

Bazı durumlarda bir interface'i kullanacak tek bir class olduğunu bilsen bile interface'i ayrıca tanımlamak mantıklı olabilir. Mesela o class'ın farklı şekilde yazılma olasılığının büyük olduğunu biliyorsan, programında tip olarak doğrudan o class'ı değil de interface'ini kullanırsın. Böylece ilerde aynı işi yapacak başka bir class yazmak istediğinde sadece o interface'i implement etmen yeterli olur. Böylece eskiden o class'ın kabul edildiği her yerde yeni class'ını da kullanabilirsin. Yani interface'leri kullanarak programın bakımını da kolaylaştırabiliyorsun.

Edit: Harika bir kaynak buldum: http://www.codestyle.org/java/faq-Interface.shtml
Link to comment
Sosyal ağlarda paylaş

  • 2 ay sonra ...
selamlar,

kucuk bir sorum olacakti. Zehtausend diye bir tane zar oyunu varmis. onu yazmaya calisiyorum. benim soracagim seyin aslinda oyunun icerigiyle alakasi yok. random belirlenen sayilarla ilgili. simdi atilan zarin 1-2-3-4-5-6 sayilarindan biri olmasi lazim tabi. asagidaki benim yazdigim kod:



import java.util.*;

public class Zehntausend {

static int range (int number, int from, int to) {
Random random = new java.util.Random();

while ((number = random.nextInt()) >= from
&& number <= to);
return number;
}

public static void main (String[] args) {
Random random = new java.util.Random();
int w1, w2, w3, w4, w5;

w1 = range(random.nextInt(), 1, 6);
w2 = range(random.nextInt(), 1, 6);
w3 = range(random.nextInt(), 1, 6);
w4 = range(random.nextInt(), 1, 6);
w5 = range(random.nextInt(), 1, 6);

System.out.println(w1 + " " + w2 + " " + w3 + " " + w4 + " " + w5);
}
}



amacim spesifik olarak bir intervall belirlemek random olarak print edilen sayilar icin. random.nextInt(7) yapinca 0 da isin icine katiliyor. o yuzden yeni metod yazilmasi gerek diye dusundum. ya da random.nextInt(7) satirinin isimi gorucek herhangi bir versiyonu var mi? bu yazdigim kodda range kismi ise yaramiyor. eksili ve/ya da cok buyuk sayilar cikiyor compile edildiginde. hatam nerede acaba?
Link to comment
Sosyal ağlarda paylaş


while ((number = random.nextInt()) >= from && number <= to);

satırını açalım biraz:

number değişkenine rastgele bir int atıyorsun
number from ile to arasındaysa while döngüsünün içine giriyorsun
while döngüsünün içi boş olduğu için from ile to arasında olduğu sürece tekrarlıyorsun
yapmak istediğinin tam tersini yapmışsın yani

Ayrıca while döngüsünü doğru şekilde yazsan aradığın interval'i bulabilmen için dakkalarca beklemen gerekebilir.

Random.nextInt(int) 0'da ekliyor iyi güzel. Sen interval içinde kaç rakam varsa ona göre Random.nextInt(int) çağırıp sonra offset'ini eklersin üstüne olur biter.

Mesela 1-6 arası mı istiyorsun. Random.nextInt(6) + 1 işini görecektir.
Link to comment
Sosyal ağlarda paylaş

Sadece 1-6 istiyorsa öyle daha pratik tabii. Ama oyun yapmak istiyormuş. Değişik intervaller gerekiyorsa o şekilde bir yardımcı metod kullanışlı olur.

Random konusunda haklısın. Burdan yakalım o zaman:

public abstract class MiragesHyperRandom {

private static final Random random = new Random();

public static int nextInt(int from, int to) {
return random.nextInt(to - from + 1) + from;
}
}
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...