سؤال

ولدي ملف نصي الذي يشبه:

name1
1 0 1 0 1
0 1 1 1 0
0 0 0 0 0
name2
1 0 1 0 1
0 0 1 1 0
0 0 0 0 1

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

وكيف انتزاع كل اسم + الصفوف قطعة مع ماسح ضوئي؟ هل هناك أي طريقة أنيقة لفرض الاتساق على عدد من الصفوف (وتوفير نوع من ردود الفعل إذا لم تكن متسقة)؟

وأنا أفكر قد تكون هناك وسيلة مريحة مع مواصفات محدد ذكية، ولكن أنا لا يمكن أن يبدو للحصول على هذا العمل.

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

المحلول 2

وحتى أفضل، بعد الإجابة مفيدة على سؤال آخر (وذلك بفضل <لأ href = " https://stackoverflow.com/users/50476/bart">Bart ):

static final String labelRegex="^\\s*\\w+$";
static final Pattern labelPattern = Pattern.compile(labelRegex, Pattern.MULTILINE);
Matcher labelMatcher = labelPattern.matcher("");

static final String stateRegex = "([10] )+[10]\\s+";
static final String statesRegex = "("+stateRegex+")+";
static final Pattern statesPattern = Pattern.compile(statesRegex, Pattern.MULTILINE);
Matcher stateMatcher = statesPattern.matcher("");

static final String chunkRegex = "(?="+labelRegex+")";
static final Pattern chunkPattern = Pattern.compile(chunkRegex,Pattern.MULTILINE);
Scanner chunkScan;

public void setSource(File source) {
    if(source!=null && source.canRead()) {
     try {
      chunkScan = new Scanner(new BufferedReader(new FileReader(source)));
      chunkScan.useDelimiter(chunkPattern);
     } catch (IOException e) {
      e.printStackTrace();
     }
    }
}

public Map<String, List<GraphState>> next(int n) {
 Map<String,List<GraphState>> result = new LinkedHashMap<String,List<GraphState>>(n);
  String chunk, rows;
  int i=0;
  while (chunkScan.hasNext()&&i++<n) {
    chunk = chunkScan.next().trim();
    labelMatcher.reset(chunk);
    stateMatcher.reset(chunk);
   if (labelMatcher.find()&&stateMatcher.find()) {
    rows = stateMatcher.group().replace(" ", "");
    result.put(labelMatcher.group(), rowsToList(rows.split("\\n")));
   }
  }
  return result;
}

نصائح أخرى

وأود أن تفعل ذلك بالطريقة بسيطة. الاستيلاء على كل سطر كما String، وتتغذى من خلال، مثلا، تعبير عادي يطابق 1-أو-0-المتبعة من قبل الفضاء النمط. إذا كان يتطابق مع، التعامل معها مثل صف. إن لم يكن، التعامل معها مثل تسمية عادي. تحقق من وجود تناسق صف عمود الحجم بعد وقوعها عن طريق التحقق من أن مجموعة كل تسمية من البيانات مباريات حجم مجموعة التسمية الأولى من البيانات.

وتحرير: لم أكن على علم من الطبقة Scanner، على الرغم من أنها تبدو في متناول يدي. أعتقد أن الفكرة الأساسية يجب أن يكون لا يزال تقريبا نفس ... استخدام Scanner تحليل المدخلات الخاصة بك، والتعامل مع مسألة أحجام نفسك.

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

وأنت ستحتاج لفتح الملف ويتكرر خلال كل سطر مع ريدلاين () حتى تصل إلى نهاية الملف.

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

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

وشبة الكود الأساسي:

int consistentSize = 5; // assume you have a size in mind

while ( (line = readLine()) != EOF)
{
    // check for if label, if it's a simple name, you won't really need a regex
    if (line == label)
    {
         // not sure if you want to do any consistency checking in here
    } else {
         String[] currLine = line.split(' ');
         bool consist = true;
         // now loop through currLine and do a check if each character is a number
         for (int i = 0; i < currLine.size(); i++)
         {
            // can't remember java function for this (isNum() I think)
            if (!currLine[i].isNum) { consist = false; break; }
         }
         // if got past this, the row has all numbers, therefore it is ok
            // could easily add another array to keep track of rows that didn't have valid numbers and suhc
         if (currLine.size() < consistentSize) System.out.println("row "+j + " is inconsistent");
    }
}

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

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