مجموعة من السلاسل لمجموعة من الكائنات

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

  •  03-07-2019
  •  | 
  •  

سؤال

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

ليس لدي مشكلة في قراءة الملف في مصفوفة سلسلة.ومع ذلك، أحتاج إلى إنشاء كائنات من كل هذه الأنواع وتخزينها في مصفوفة من النوع Vehicle[].على سبيل المثال، يبدو جزء من الملف كما يلي:

  • عربة
  • كيم ستانلي روبنسون
  • 2344 محرك المحكمة
  • (221)885-7777
  • stackoverflow@overflow.com
  • سيارة أمريكية
  • جون بونيون
  • 1010 حارة ثنائية
  • (221)885-55643
  • bgt.com
  • قابلة للتحويل
  • صنع في ديترويت
  • مصنع الاتحاد

حيث يكون نوع الفئة هو السطر الأول متبوعًا باسم المالك والعنوان ورقم الهاتف وعنوان البريد الإلكتروني... ولكل نوع حقول خاصة به.لذا فإن السيارة الأجنبية لا تُصنع في ديترويت.يظهر كل حقل من هذه الحقول في سطر منفصل في الملف.إذن ما قمت به هو قراءة الملف بأكمله في مصفوفة سلسلة.ومع ذلك، أحتاج إلى العثور على الأنواع الخاصة بي في مصفوفة السلاسل، وإنشاء كائنات من تلك الأنواع، وتخزينها في مصفوفة المركبات.مشكلتي الرئيسية هي أن كل حقل بيانات موجود في سطر منفصل.كيف يجب أن أتعامل مع هذه المشكلة؟هذا هو كود جافا بالمناسبة.

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

المحلول

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

شيء من هذا القبيل (سأسمح لك بملء الفراغات بنفسك):

int i = 0;
ArrayList<vehicle> vehicles = new ArrayList();
while (i < data.length)
{
  if (data[i].equalsIgnoreCase("vehicle"))
  {
    Vehicle vehicle = new Vehicle();
    vehicle.setOwner(data[++i]);
    ...
    vehicles.add(vehicle);
  }
  else if (data[i].equalsIgnoreCase("american car"))
  {
    ...
  }
  i++;
}

نصائح أخرى

السؤال غير واضح.هل تريد معرفة كيفية تحليل الملف واستخدام الكلمات الموجودة في كل سطر لإنشاء كائن منه؟

مستعار:

Vehicle_ptr myVeh = null;
for each line in file
switch line
{
case vehicle: myVeh = new Vehicle();
case American Car : myVeh = new AmericanCar();
default:
if (line.startswithaninteger && (myVeh != NULL)) myVeh.address = line;
etcetc.
}

نصائح:استخدم معرفات النوع في الملف النصي. على سبيل المثال:السيارة: Americancar العنوان: 12345 BLA etcetc

أو استخدم برنامج التسلسل

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

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

IAdapter adapter = AdapterFactory.Create( "American Car" );
Object concreteObject = adapter.Popluate( stringArray, currentIndex );

الآن، إذا كان لديك القدرة على التحكم في كيفية تخزين البيانات، فقد ترغب في النظر في التسلسل القياسي، حتى JSON، لتسهيل المعالجة.

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

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

سيقوم المصنع بتحليل وفصل المدخلات وتحديد ما سيتم بناؤه.كل نوع من مُنشئ السيارة يعتني بالمعلومات الخاصة به تلك السيارة فقط, ، وينفذ التأكيدات المناسبة.

سيحتفظ المصنع بقائمة السيارات التي تم تصنيعها، ويعيد تلك القائمة (الأمريكية/الأوروبية/اليابانية) عند الانتهاء.

في الكود الزائف:

whilst(!done) {
   fields.add(fieldFromFile);

   if (carSpecificationCompleted) {
       type = getType(fields);
       if (type == 'American') {
          car = new AmericanCar(fields);
       }
       else if (type == 'European') {
          car = new EuropeanCar(fields);
       }
       cars.add(car);
       clearStoredFields();
   }
}

هل لديك السيطرة على الملف الذي يتم تمريره؟إذا كان الأمر كذلك، هل أقترح تنسيقه باستخدام XML ثم تحليله باستخدام JDOM؟من شأنه أن يجعل حياتك أسهل من حيث التحليل.على سبيل المثال، يمكنك تنسيق جميع إدخالات المركبة على النحو التالي:



    <node type="vehicle>
       <attributes location="detroit" color="red" />
    </node>

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

تجاهل هذه النصيحة إذا لم يكن لديك سيطرة على تنسيق الملف.

عندما يكون لديك الاختيار، قم بتغيير تنسيق الملف الخاص بك.

يمكنك إجراء تسلسل للكائن الخاص بك باستخدام com.xstream.ثم ما عليك سوى تخزين كائن Java الكامل دون التحقق من وجود بعض القيمة.

سأستخدم منشئ النمط هنا بدلاً من المصنع.لا يوجد فرق كبير ولكن تجد الأمر أسهل قليلاً عندما تختلف المعلمات كما يبدو في مثاله.

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