Turkcell | Geleceği Yazanlar

Soru & Cevap

İki Boyutlu Dizide sadece bir boyutunu rnd seçme

12.11.2019 - 01:04


String[] dizi_paragraf = dosya.split("\n");
for (int i = 0; i < dizi_paragraf.length; i++) {
    String[] dizi_cumle = dizi_paragraf[i].split("\\.");
    String[][] dizi_total = new String[dizi_paragraf.length][dizi_cumle.length];
    int[][] dizi = new int[dizi_paragraf.length][dizi_cumle.length];
    for (int j = 0; j < dizi_cumle.length; j++) {
        dizi_total[i][j] = dizi_cumle[j];
        dizi[i][j] = j;
        System.out.println(dizi[i][j]);
    }
}


Output:

    0-0
    0-1
    1-0
    1-1
    1-2
    2-0
    3-0
    3-1
    4-0
    4-1
    5-0
    5-1
    5-2
    5-3

 
Çıktı yukarıdaki gibi ama ben aşağıdaki gibi istiyorum. En aşağıda açıklama var. Bu değişmeli sürekli aynı şekilde kalmamalı.


        0-1
        0-0
        1-1
        1-0
        1-2
        2-0
        3-1
        3-0
        4-0
        4-1
        5-3
        5-1
        5-0
        5-2



"i" sabit olmalı. Fakat j rastgele seçilmelidir. 0 endeksi için, j değeri: 0 ve 1'dir. Bu, rastgele seçilmelidir. indeks 1 için, j değeri: 0,1 ve 2. Bu, rastgele seçilmelidir.
Her i için j'deki değer rastgele değişir, ancak j uzunluğuna kadar.
Bunu nasıl yapabilirim? Herhangi bir fikri olan?
Örneğin, dizi 0 için 0 veya 1 üretmelidir. Birinci dizi için 0.1 veya 2 üretmelidir. 2. Indis için sadece 0 alınmalı. vb.
Sadece örnek. Bu değişiklik olabilir. Bunu dinamik olarak alıyorum.

577 Görüntülenme

2 Cevap

Özge
12.11.2019 - 12:53

Yaptığınız örnek için çok teşekkür ederim ama dediğim gibi i ve j değerleri değişebiliyor metne göre. O yüzden en başta static olarak alamam klasik bir metini veriyorum programa ve onu da i ve j değerlerinde tutturuyorum. Bu her zaman değişebilir. Sabit olarak alamam. Ve dediğim gibi rastgele seçeceğim ama aynısı gelmemesi gerekiyor. indis 0 ise 0 veya 1 seçilmeli. ya da 1 veya 0 gelir. Ama diyelim 0 indisinde 4 cümle var o yüzden j burada 0,1,2 ve 3 oluyor. Bunu da rastgele seçmem gerekiyor. Yani tekrarlı olmamalı. 
 

String[] dizi_paragraf = dosya.split("\n");
for (int i = 0; i < dizi_paragraf.length; i++) {
	String[] dizi_cumle = dizi_paragraf[i].split("\\.");
	String[][] dizi_total = new String[dizi_paragraf.length][dizi_cumle.length];
		for (int j = 0; j < dizi_cumle.length; j++) {
			dizi_total[i][j] = dizi_cumle[j];
	}
}

Yukarıdaki kod işlemi yapıyor. Ben burada sadece ayırma işlemini yaptım. i ve j değerleri girilen metne göre değişiyor. Bu metin dosya değişkeninde tutuluyor.Bilmiyorum daha fazla nasıl açıklayabilirim.

Sitede yorum yapabilmek için giriş yapın ya da üye olun.

Gürkan
12.11.2019 - 13:14
C# Konsol projesi olarak örneği oluşturduğum için ve program Main bloğunda çalıştığı için global değişken ve metodları static olarak tanımladım ve elimde paragraftan gelecek veriler bulunmadığı için de verileri sizin verdiğiniz sayısal örneklerden aldım. Yani sizin verileri ve nesneleri static olarak alma zorunluluğunuz yok. Paylaştığım kodları aradaki dil farklarını ortadan kaldırarak projenize entegre edebilirsiniz. Kodlar istediğiniz tüm koşulları sağlamaktadır. Sadece programınıza iyi bir şekilde entegre etmeniz gerekiyor. Veriler değişse bile sıkıntı çıkmayacaktır. İsterseniz projenize entegre etme konusunda da yardımcı olabilirim.
Gürkan
12.11.2019 - 02:55

Normalde kod paylaşarak gösterebilirdim ama paragraflardan gelen veriler elimde olmadığı için sadece fikir verebileceğim. Şimdiden mantık olarak bir hatam olursa kusura bakmayın. Döngü için ilk olarak her bir tekrarlı halde gelen i değerlerine karşılık gelen j değerlerini jagged (çok boyutlu) bir dizide toplayın. Yani { i, { j1, j2, j3 } } gibi bir hiyerarşi şeklinde. Bunu yaptıktan sonra bir başka döngü içinde de artık döngü her başladığında i değerine karşılık gelen j değerini şu şekilde dizi[i][burada da random olarak alınacak j dizisinin aralığı] şeklinde alarak her bir i değerine karşılık j dizisinden rastgele verileri çekebilirsiniz. Tabi burada j değerlerinin tümünün veya birkaçının aynı gelme olasılığı var ki siz örneğinizde bunu belirtmemişsiniz. Eğer aynı veriler üretilmeyecekse, size gelen paragraf verileri doğrultusunda döngü içinde bunun kontrollerinin yapılması gerekir ya da alternatif başka çözümler üretilebilir. İkinci bir çözüm yolu ise daha basit ve kısa. Eğer Java'da bu mümkünse ya da mantık hatası yapmıyorsam dizi[i][j] şeklinde ekrana yazdırırken "[j]"  burada j gelen yerde j nin uzunluğu kadar bir aralıkta rastgele seçtirme işlemi de yaptırabilirsiniz. Yorumu düzenleyip kod da ekledim :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IkiBoyutluDiziRndOrnegi
{
    class Program
    {
        static Random rnd = new Random();

        //Sizin verdiğiniz değerlere göre oluşturuldu.
        static int[][] dizi =
        {
            new int[]{0,1},
            new int[]{0,1,2},
            new int[]{0},
            new int[]{0,1},
            new int[]{0,1},
            new int[]{0,1,2,3},
        };

        static void Main(string[] args)
        {
            NormalCikti();
            RandomCikti();
            TekrarKorumaliRandomCikti();

            Console.ReadKey();
        }

        /// <summary>
        /// Dizi normal bir şekilde ekrana yazdırılıyor.
        /// </summary>
        static void NormalCikti()
        {
            StringBuilder stb = new StringBuilder();
            stb.AppendLine("Normal Çıktı:");

            for (int i = 0; i < dizi.Length; i++)
            {
                for (int k = 0; k < dizi[i].Length; k++)
                {
                    stb.AppendLine($"{i} - {dizi[i][k].ToString()}   ");
                }
            }

            stb.AppendLine("\n\n");
            Console.Write(stb.ToString());
        }

        /// <summary>
        /// Burada her i değeri için aynı j değerleri rastgele karıştırılıp yazdırılıyor.
        /// Fakat tekrarlı veriler ayıklanmıyor.
        /// </summary>
        static void RandomCikti()
        {
            StringBuilder stb = new StringBuilder();
            stb.AppendLine("Random Çıktı:");

            for (int i = 0; i < dizi.Length; i++)
            {
                for (int k = 0; k < dizi[i].Length; k++)
                {
                    stb.AppendLine($"{i} - {dizi[i][rnd.Next(dizi[i].Length)].ToString()}   ");
                }
            }

            stb.AppendLine("\n\n");
            Console.Write(stb.ToString());
        }

        /// <summary>
        /// Burada her i değeri için aynı j değerleri rastgele karıştırılıp yazdırılıyor.
        /// Tekrarlayan değerler ayıklanıyor ve tekrarsız olması sağlanıyor.
        /// </summary>
        static void TekrarKorumaliRandomCikti()
        {
            int[][] tempDizi = new int[6][];
            int tempRnd = 0;
            dizi.CopyTo(tempDizi, 0);

            StringBuilder stb = new StringBuilder();
            stb.AppendLine("Tekrar Korumalı Random Çıktı:");

            for (int i = 0; i < tempDizi.Length; i++)
            {
                for (int k = 0; k < tempDizi[i].Length; k++)
                {
                    do
                    {
                        tempRnd = rnd.Next(tempDizi[i].Length);
                    }
                    while (tempDizi[i][tempRnd] == -1);
                    
                    stb.AppendLine($"{i} - {tempDizi[i][tempRnd].ToString()}   ");
                    tempDizi[i][tempRnd] = -1;
                }
            }

            stb.AppendLine("\n\n");
            Console.Write(stb.ToString());
        }
    }
}

Bu da çıktısı:

Normal Çıktı:
0 - 0
0 - 1
1 - 0
1 - 1
1 - 2
2 - 0
3 - 0
3 - 1
4 - 0
4 - 1
5 - 0
5 - 1
5 - 2
5 - 3



Random Çıktı:
0 - 1
0 - 0
1 - 2
1 - 2
1 - 1
2 - 0
3 - 1
3 - 0
4 - 1
4 - 1
5 - 2
5 - 0
5 - 2
5 - 0



Tekrar Korumalı Random Çıktı:
0 - 1
0 - 0
1 - 1
1 - 2
1 - 0
2 - 0
3 - 0
3 - 1
4 - 1
4 - 0
5 - 2
5 - 3
5 - 1
5 - 0



 

Sitede yorum yapabilmek için giriş yapın ya da üye olun.

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.