Thread overview
JSON Uyumlu Çokuzlu Örneği
Feb 22, 2022
Salih Dincer
Feb 23, 2022
Ali Çehreli
Feb 25, 2022
Salih Dincer
Feb 25, 2022
Salih Dincer
Feb 25, 2022
Salih Dincer
February 22, 2022

Merhaba,

Aşağıda D olanaklarını biraz zorlamak istediysem de, dili bir işlemci (D == CPU) gibi düşünürsek hiç ısınma olmadı bile! Zorlanan ben oldum galiba :)

Bakalım n'olcak, hangi olanağı seveceksiniz, söyleyin bakalım sevdiniz mi? Belki devamında bir JSON dosyasından okutup AA içine atar ve şimdi yapacağımız gibi sıralarız, ne dersiniz?

Veri kaynağı: https://en.m.wikipedia.org/wiki/English_punctuation

string[char] dict = [
    '.': "Dot",
    ',': "Comma",
    '"': "Doublequote",
   '\'': "Apostrophe",
    '-': "Hyphen",
    '?': "Question",
    ':': "Colon",
    '!': "Exclamation",
    ';': "Semicolon"
  ];

// Yukardaki gibi AA dizisinin indeksi karakter, açıklaması da bir dizge olsun ve bunların kullanım sıklığını da şu şekilde AA içine alalım:

  char[float] freq = [
    65.3:46,
    61.3:44,
    26.7:34,
    24.3:39,
    15.3:45,
    5.6 :63,
    3.4 :58,
    3.3 :33,
    3.2 :59
  ];

// Hemen basit bir şekilde ve dolaylı olarak bağlayıp (cross-indexing) ekrena şu şekilde listelemek mümkün:

  foreach(f; freq.keys.sort!"a>b") {
    auto key = freq[f];
    writefln("(%c) %s, %.1f", key, dict[key], f);
  }
/* ÇIKTISI:
(.) Dot, 65.3
(,) Comma, 61.3
(") Doublequote, 26.7
(') Apostrophe, 24.3
(-) Hyphen, 15.3
(?) Question, 5.6
(:) Colon, 3.4
(!) Exclamation, 3.3
(;) Semicolon, 3.2
*/

Ama bu pek düzenli görünmüyor. Çünkü başka bir üçlü veri elimizde olabilir ve bunları sıralı bir şekilde listelemek gerekebilir. Belki daha kolay yolu vardır (Ali hocam, AA kullanmadan mümkün mü?) ama şimdilik şu leziz çözüm ile idare edin:

import std.algorithm;
import std.stdio, std.typecons;

struct SÖZLÜK(C, F, S) {
  S[C] dict;
  C[F] freq;

  @property add(Tuple!(C, F, S) chr) {
    dict[chr[0]] = chr[2];
    freq[chr[1]] = chr[0];
  }

  string toString() const {
    import std.array : appender;
    import std.format : formattedWrite;

    auto r = appender!string;
    foreach(f; freq.keys.sort!"a>b") {
      auto key = freq[f];
      r.formattedWrite("(%c) %s, %.1f\n",
                    key, dict[key], f);
    }
    return r.data;
  }
}

void main()
{
  writeln("İngilizce'de kullanılan noktalama işaretlerinin ağırlıkları");
  alias index = char;
  alias rank = float;
  alias name = string;

  alias chr = Tuple!(index, rank, name);

  auto chrs = [chr(46, 65.3, "Dot"),
               chr(44, 61.3, "Comma"),
               chr(34, 26.7, "Doublequote"),
               chr(39, 24.3, "Apostrophe"),
               chr(45, 15.3, "Hyphen"),
               chr(63,  5.6, "Question"),
               chr(58,  3.4, "Colon"),
               chr(33,  3.3, "Exclamation"),
               chr(59,  3.2, "Semicolon")];

  SÖZLÜK!(index, rank, name) sözlük;
  foreach(tup; chrs) {
    sözlük.add(tup);
  }
  sözlük.writeln;
}

Başarılar...

February 22, 2022
On 2/22/22 14:12, Salih Dincer wrote:

> // Yukardaki gibi AA dizisinin indeksi karakter

Burada hiç önemi olmasa da anahtarın olası değerleri kısıtlı sayıda olduğunda eşleme tablosu yerine dizi kullanmak daha hızlı olabilir.

void main() {
  string[char.max - char.min + 1] dict;

  // Yine de senin verinden yararlanıyorum. :)
  foreach (t; [
      '.': "Dot",
      ',': "Comma",
      '"': "Doublequote",
     '\'': "Apostrophe",
      '-': "Hyphen",
      '?': "Question",
      ':': "Colon",
      '!': "Exclamation",
      ';': "Semicolon"
    ].byKeyValue) {
    dict[t.key] = t.value;
  }

  // Bu noktadan sonra erişim işlemi daha hızlıdır.
  // Ancak, if ('x' in dict) gibi bir aramayı
  // if (!dict['x'].empty) gibi değiştirmek
  // gerekecektir.
  //
  // Tabii normalde bu dizi bir struct arkasına
  // gizlenir ve opBinaryRight!"in" vs. de yazılır
  // ve aynı eşleme tablosu gibi kullanılır.
}

Dediğim gibi, bu tür eniyileştirmeleri başlangıçta uygulamaya gerek yok ama hem şimdiki işimde hem de Weka'da aynı kavramı uygulamıştık.

>    char[float] freq = [
>      65.3:46,
[...]
>    ];

Burada önemli olmadığını görüyorum ama anahtar türü olarak kesirli sayı kullanma konusunda bol şans diliyorum. ;) Ek olarak, tersi sanki zaten daha mantıklı gibi geliyor:

  float[char] /* ... */

> // Hemen basit bir şekilde ve dolaylı olarak bağlayıp

Mantıklı. Benzerlerini ben de kullanmıştım.

Ali

February 25, 2022

On Tuesday, 22 February 2022 at 22:12:07 UTC, Salih Dincer wrote:

>

Belki devamında bir JSON dosyasından okutup AA içine atar ve şimdi yapacağımız gibi sıralarız, ne dersiniz?

Sanırım robota takıldım!

Birkaç gün önce yazdığım cevabım arafta kalmış! Ama iyi oldu, dursun orda çünkü kodu biraz daha geliştirdim 😀

import std.algorithm;
import std.stdio, std.json;

void main() {
  enum kıstas = "a < b";
  auto okulum = SIRALA!long(veri, "OKUL");
// Sıralanan verinin, kaynağı-^ kökü-^

  okulum.school!kıstas.writeln;
  okulum.number!kıstas.writeln;
}

Ama parça parça yayınlayacağım. Önce veriyi nasıl sıralayacağımızı (kıstas), kurulumu ve basitçe sıralanmış şekilde alabildiğimizi göstermek istiyorum. Sonra yetenekli yapımızı ve robot izin verirse JSON verisini göreceğiz. Zaten çıktıdan ve kod içindeki anahtar sözcüklerden veriyi kendiniz de oluşturabilirsiniz:

Elektronik Mühendisi Kaan Haktan/11154217
Endüstri Mühendisi Ahmet Candan/41153007
Makine Mühendisi Mehmet Demir/12257000

Elektronik Mühendisi Kaan Haktan/11154217
Makine Mühendisi Mehmet Demir/12257000
Endüstri Mühendisi Ahmet Candan/41153007

Başarılar...

February 25, 2022

On Friday, 25 February 2022 at 05:05:49 UTC, Salih Dincer wrote:

>

Sonra yetenekli yapımızı [...] göreceğiz.

Önceki sürümden (SÖZLÜK) şimdi yayınladığım yapıya (SIRALA) göre en önemli fark, Tuple gitti JSON geldi ve 3. bir AA'ya ihtiyaç duymam oldu:
string[long]oNum

Özellikle bu sonuncusuna değinmeliyim; basit bir Excel tablosunda yaptığımız sıralama işlemini çeşitlendirmek için gerekliydi. Çünkü numaraya göre sıralama tamam da isim veya okula göre sıralama yaparken birine ulaşamadım. Yani ulaşamadığımı elde edebilmek için 2. bir foreach() döngüsüne ihtiyaç duymamdı. En akıllıca çözümün 3. bir AA olduğunu düşünüyorum, ne dersiniz?

import std.array : appender;
import std.format : formattedWrite;

struct SIRALA(T) {
  string[T] isim, oNum; // numaraya göre
  T[string] okul;       // bölümüne göre

  this(string data, string table) {
    with(data.parseJSON[table].object["gelen"]) {
      foreach(öğrenci; object["öğrenciler"].array) {
        const number = öğrenci.object["numarası"].integer;
        isim[number] = öğrenci.object["adı"].str;

        const school = öğrenci.object["fakültesi"].str;
        oNum[number] = school;
        okul[school] = number;
      }
    }
  }

  string number(string E)() const {
    auto r = appender!string;
    foreach(number; oNum.keys.sort!E) {
      r.formattedWrite("%s %s/%d\n", oNum[number],
                                     isim[number],
                                          number);
    }
    return r.data;
  }

  string school(string E)() const {
    auto r = appender!string;
    foreach(school; okul.keys.sort!E) {
      const number = okul[school];
      r.formattedWrite("%s %s/%d\n", school,
                               isim[number],
                                    number);
    }
    return r.data;
  }
}
February 25, 2022

On Tuesday, 22 February 2022 at 22:12:07 UTC, Salih Dincer wrote:

>

JSON dosyasından okutup [...]

Gelelim veri kaynağına... :)

Ey postman robot, lütfen buna izin ver:

string veri = `
{
  "OKUL": {
    "gelen": {
      "öğrenciler": [{
        "adı": "Mehmet Demir",
        "numarası": 12257000,
        "fakültesi": "Makine Mühendisi"
      },
      {
        "adı": "Kaan Haktan",
        "numarası": 11154217,
        "fakültesi": "Elektronik Mühendisi"
      },
      {
        "adı": "Ahmet Candan",
        "numarası": 41153007,
        "fakültesi": "Endüstri Mühendisi"
      }]
    },
    "mezun": {
      "öğrenciler": [{
        "adı": "Celal Bayar",
        "numarası": 12530154,
        "fakültesi": "Makine Mühendisi"
      },
      {
        "adı": "Hakan Cengiz",
        "numarası": 293813877,
        "fakültesi": "Elektronik Mühendisi"
      }]
    }
  }
}`;