كيفية إنشاء ملصق فريد مع مفاتيح زيادة لتكرارات؟

StackOverflow https://stackoverflow.com/questions/1336453

  •  20-09-2019
  •  | 
  •  

سؤال

هذه مشكلة تقنية البرمجة في سياق جافا.

المشكلة: لدينا مفاتيح السلسلة التي يجب أن تكون كلها فريدة من نوعها. يعد تنفيذ المجموعة مزيجا من الخريطة والتقويم الذي يسمح لأحد باستخدام المجموعة إما بمثابة خريطة أو قائمة صفيف (JFreechart's DefaultPiedataset إذا كنت فضوليا). إذا كان لدينا قطعة واحدة من البيانات نريد أن يكون مفتاح نفسه. إذا كان لدينا مضاعفات مفصولة ببعض المفتاح الآخر الذي نريد البيانات بالإضافة إلى فاصل ورقم زيادة.

علي سبيل المثال:

البيانات التي مع اثنين Bob إدخالات ثم Albert سيكون لها مفاتيح مثل ["Bob", "Albert"].

البيانات التي تبدو Albert و Bob مع اثنين Bob إدخالات مع an. Albert بين سيكون لها مفاتيح مثل ["Bob : 1", "Albert", "Bob : 2"].

هذا هو رمزنا حتى الآن:

String dataKey = "";
DefaultPieDataset ringDataset = new DefaultPieDataset();
for(String thisData: dataList)
{
    int dataValue;
    if(dataKey.equals(thisData))
    {
        dataValue= ringDataset.getValue(dataKey).intValue() + 1;
    }else
    {
        dataKey= thisData;
        if(ringDataset.getKeys().contains(dataKey) || ringDataset.getKeys().contains(dataKey+ " : 1")) //has this name been represented already?
        {
            if(ringDataset.getKeys().contains(dataKey)) //do we need to change the name to accommodate multiples?
            {
                int existingKeyIndex = ringDataset.getIndex(dataKey);
                int existingKeyValue = ringDataset.getValue(dataKey).intValue();
                ringDataset.remove(dataKey);
                ringDataset.insertValue(existingKeyIndex, dataKey+ " : 1", existingKeyValue);
            }

            int counter = 2;
            do{
                dataKey= thisData + " : " + counter;
                counter ++;
            }while(ringDataset.getKeys().contains(dataKey)); //ensure that we are using a new key
        }
        dataValue= 1;
  }
 ringDataset.setValue(dataKey, dataValue);
}

حاليا، يكدس الكود على ": #" لكل نسخة مكررة بحيث بدلا من Bob : 2 التي تجعل Bob : 1 : 2

تحدي إضافي هو أنه لا أستطيع غورانتي أن الاسم لن يكون لديه فاصل (كولون في المثال).

أيضا هناك شريط أحمر واسع النطاق مطلوب لأي مكتبات مضافة، لذلك هناك حاجة إلى حل Java API فقط.

شكرا لك على المساعدة في هذا الإعصار الدماغ بالذات،
آدم

تحرير: لمزيد من توضيح التعليمات البرمجية تعتمد قيمة العناصر من عدد المرات التي توصل فيها نوع البيانات إلى صف واحد. لذلك في المثال الأول المفتاح Bob لديه قيمة 2 و Albert 1. في المثال الثاني، تحتوي جميع المفاتيح على قيمة 1.

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

المحلول

أفترض أنك لا تضطر إلى التعامل مع تفرد النظام الموزع لأن مشكلتك موجودة على جانب العميل. بالإضافة إلى ذلك، أفترض أنك لست مضطرا للتعامل مع المزامنة على مؤشرات ترابط متعددة. إذا لم يكن الأمر كذلك، فيمكنك أن تنظر في وضع الكلمة الأساسية المتزامنة في طريقة InsidentLabelCount ()، وربما يكون الأداء جيدا.

أود أن كسر الرموز الخاصة بك إلى جزأين، لذلك هو أكثر قابلية للإدارة:
- الجزء 1: تتبع التسميات المعروفة بالفعل - الجزء 2: إنشاء التسمية الفريدة

فيما يلي الرموز التي اكتبتها بسرعة (بدون منطق تجميع)

class KnownLabels
{
  Map<String, Integer> currentCountsByLabel;

  public int incrementLabelCount(String label)
  {
    Integer count = currentCountsByLabel.get(label);
    if(count==null)
      count = 1;
    else
      count += 1;

    currentCountsByLabel.put(label, count);

    return count;
  }
}

class UniqueLabelGenerator
{
  private KnownLabels knownLabels = new KnownLabels();

  public String getUniqueLabel(String label)
  {
    int i = knownLabels.incrementLabelCount(label);

    if(i>1)
      return label + ":" + i;

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