SORU
20 Mayıs 2014, Salı


İşleme türleri Listesi Esqueleto ile

Veri türü olarak tanımlıyorum:

data ComitteeView = CommitteeView { committeeId :: CommitteeId
                                  , committeeMembers :: [Person] 
                                  }

data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }

Bu durumda, Kalıcı bir model olarak tanımlıyorum:

Person
  name  Text

Committee
  name  Text

CommitteePerson
  personId    PersonId
  committeeId CommitteeId

Oldukça kolay bir CommitteeView doldurmak için bir sorgu, Esqueleto kullanarak oluşturabilirsiniz. Böyle birşey olurdu:

getCommitteeView cid = 
  CommitteeView <$> runDB $ 
    select $
      from (person `InnerJoin` pxc `InnerJoin` committee) -> do
        on  (committee ^. CommitteeId ==. pxc ^. CommitteePersonCommitteeId)
        on  (person ^. PersonId       ==. pxc ^. CommitteePersonPersonId)
        where_ (committee ^. CommitteePersonCommitteeId ==. val cid)
        return person

Şimdi, CommitteesView doldurma sorununu ele alalım. Prensip olarak, yukarıdaki sorguda sorgu çalıştırarak doldurmak için yeterli bilgi elde ettik. Tamam, yeterince adil. Şimdi nasıl "Haskell listesi grup" SQL gibi group by kullanabilir miyim? Nasıl insanların listesini bir liste ile sonunda o satırlar kat edebilir miyim?

esqueleto gibi dava (yani, yapacak bir kombinatorik yok) kaldıramaz kanısındayım. Ve alttaki veritabanı belli bir sütun olarak Haskell listeleri desteklemiyor. Ama, elbette, bu sorun karşısında tek kişi ben olamam. Etkili bir strateji nedir? N-liste içine listelerinin n listesi katlanır? Veya n 1 çalışan sorgular? Başka seçenekler de var mı?

CEVAP
22 Kasım 2010, PAZARTESİ


Bu eğer çok sayıda dosya varsa daha hızlı olabilir. Bu her dosyanın son değiştirilme tarihini sadece getirilen bu tür süslemeleri-undecorate desen kullanırbir kezyerine sıralama algoritması iki dosyayı karşılaştırır her zaman. Bu potansiyel olarak O(n log n) G/Ç çağrıları(n) sayısını azaltır.

Bu sadece hız ile özellikle endişeleriniz varsa kullanılmalıdır çok fazla kod oldu, ve büyük ölçüde pratikte daha hızlı kontrol etmedim).

class Pair implements Comparable {
    public long t;
    public File f;

    public Pair(File file) {
        f = file;
        t = file.lastModified();
    }

    public int compareTo(Object o) {
        long u = ((Pair) o).t;
        return t < u ? -1 : t == u ? 0 : 1;
    }
};

// Obtain the array of (file, timestamp) pairs.
File[] files = directory.listFiles();
Pair[] pairs = new Pair[files.length];
for (int i = 0; i < files.length; i  )
    pairs[i] = new Pair(files[i]);

// Sort them by timestamp.
Arrays.sort(pairs);

// Take the sorted pairs and extract only the file part, discarding the timestamp.
for (int i = 0; i < files.length; i  )
    files[i] = pairs[i].f;

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrey Menshikov

    Andrey Mensh

    28 Ocak 2012
  • buttheadgsxr1000

    buttheadgsxr

    24 Ocak 2008
  • ibebrent

    ibebrent

    23 Temmuz 2007