سؤال

لدي مفتاح => طاولة القيمة أود الفرز في LUA. المفاتيح هي جميع الأعداد الصحيحة، ولكنها ليست متتالية (ولديها معنى). يبدو أن وظيفة الفرز الوحيدة لوا table.sort, ، والتي تعالج الجداول كصفوفات بسيطة، وتخلص المفاتيح الأصلية وترابطها مع عناصر معينة. بدلا من ذلك، أود أن أكون قادرا على الاستخدام PHP's asort() وظيفة.

ماذا املك:

items = {
    [1004] = "foo",
    [1234] = "bar",
    [3188] = "baz",
    [7007] = "quux",
}

ما أريد بعد عملية الفرز:

items = {
    [1234] = "bar",
    [3188] = "baz",
    [1004] = "foo",
    [7007] = "quux",
}

أيه أفكار؟

يحرر: بناء على إجابات، سأفترض أنه ببساطة هو مجرد جوهر غريب من مترجم LUA المضمن مع معين، ولكن في جميع الاختبارات الخاصة بي، pairs() قم دائما بإرجاع عناصر الجدول بالترتيب الذي تمت إضافته فيه إلى الجدول. (أي أن اثنين من الإعلانات المذكورة أعلاه ستتكر بشكل مختلف).

لسوء الحظ، لأن هذا ليس سلوكا طبيعيا، يبدو أنني لا أستطيع الحصول على ما أحتاج إليه؛ لا تملك LUA الأدوات اللازمة المدمجة (بالطبع) والبيئة المضمنة محدودة للغاية بالنسبة لي للعمل من حولها.

لا يزال، شكرا لمساعدتكم، كل شيء!

هل كانت مفيدة؟

المحلول

يبدو أنك تسيء فهم شيء ما. ما لديك هنا هو مصفوفة متصلة. وبعد لا تملك المصفوفات الترابطية ترتيب صريح عليها، على سبيل المثال، إنه فقط التمثيل الداخلي (عادة ما يتم فرزه) الذي يأمرهم به.

باختصار - في LUA، كل من الصفائف التي نشرتها هي نفس الشيء.

ما تريد بدلا من ذلك، هو مثل هذا التمثيل:

items = {
    {1004, "foo"},
    {1234, "bar"},
    {3188, "baz"},
    {7007, "quux"},
}

بينما لا يمكنك الحصول عليها بواسطة الفهرس الآن (يتم فهرسة 1، 2، 3، 4، لكنك يمكن قم بإنشاء صفيف فهرس آخر)، يمكنك فرزها باستخدام table.sort.

ستكون وظيفة الفرز بعد ذلك:

function compare(a,b)
  return a[1] < b[1]
end

table.sort(items, compare)

نصائح أخرى

كما قال كوميل، أنت تتعامل مع المصفوفات الاسترقسية، والتي ليس لها أمر مضمون.

إذا كنت تريد الطلب المفتاح بناء على القيمة المرتبطة بها مع الحفاظ على وظائف الصفيف المنشأ، فيمكنك القيام بشيء مثل هذا:

function getKeysSortedByValue(tbl, sortFunction)
  local keys = {}
  for key in pairs(tbl) do
    table.insert(keys, key)
  end

  table.sort(keys, function(a, b)
    return sortFunction(tbl[a], tbl[b])
  end)

  return keys
end

items = {
    [1004] = "foo",
    [1234] = "bar",
    [3188] = "baz",
    [7007] = "quux",
}

local sortedKeys = getKeysSortedByValue(items, function(a, b) return a < b end)

SortEdkeys هو {1234،3188،1004،7007}، ويمكنك الوصول إلى بياناتك مثل ذلك:

for _, key in ipairs(sortedKeys) do
  print(key, items[key])
end

نتيجة:

1234     bar     
3188     baz     
1004     foo     
7007     quux    

هم، غاب عن الجزء غير قادر على التحكم في التكرار. هناك

ولكن في لوا هناك عادة دائما وسيلة.

http://lua-users.org/wiki/roderedasociesable.

هذا بداية. الآن ستحتاج إلى استبدال الأزواج () التي تستخدمها المكتبة. قد تكون هذه هي اللعاب كأزواج = my_pairs. يمكنك بعد ذلك استخدام الحل في الرابط أعلاه

تختلف صفائف PHP عن جداول LUA.

  • قد يكون مجموعة PHP طلبت القائمة أزواج القيمة الرئيسية.

  • يحتوي طاولة LUA دائما على مجموعة غير مرتبة أزواج القيمة الرئيسية.

يعمل طاولة LUA كصفيف عندما يختار مبرمج استخدام الأعداد الصحيحة 1، 2، 3، ... كمفاتيح. بناء جملة اللغة ووظائف المكتبة القياسية، مثل table.sort تقديم دعم خاص للجداول مع مفاتيح عدد صحيح على التوالي.

لذلك، إذا كنت ترغب في محاكاة مجموعة PHP، فسيتعين عليك تمثيلها باستخدام قائمة أزواج القيمة الرئيسية، والتي هي حقا جدول للجداول، ولكن من المفيد التفكير في الأمر كقائمة من أزواج القيمة الرئيسية وبعد تمرير وظيفة "أقل من" مخصصة إلى table.sort وستكون جميعها مجموعة.

NB LUA يسمح لك مزج مفاتيح عدد صحيح على التوالي مع أي أنواع أخرى من المفاتيح في نفس الجدول والتمثيل فعال. يمكنني استخدام هذه الميزة أحيانا، عادة في وضع علامة على صفيف مع بعض القطع من البيانات الوصفية.

يأتي هذا بعد بضعة أشهر، مع نفس الاستعلام. يبدو أن الإجابة الموصى بها تحدد الفجوة بين ما كان مطلوبا وكيف يبدو هذا في لوا، لكنه لم يحصلني على ما كنت عليه بعد: - الذي كان هاش فرز حسب المفتاح.

ومع ذلك، فإن المهام الثلاث الأولى في هذه الصفحة: http://lua-users.org/wiki/sortedetiteration.

فعلت قليلا من لوا ترميز منذ بضع سنوات ولكني لم أعد بطلاقة في ذلك.

عند مواجهة مشكلة مماثلة، قمت بنسخ صفيفي إلى مجموعة أخرى مع عكس المفاتيح والقيم، ثم استخدمها sort على الصفيف الجديد.

لم أكن على علم بإمكانية فرز الصفيف باستخدام الطريقة التي توصي بها Kornel Kisielewicz.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top