يعطي String Tokenizer في Java مخرجات خاطئة.بحاجة إلى مساعدة (ربما حل سهل)

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

سؤال

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

 StringTokenizer stspace = new StringTokenizer(sent, " .?");
    int nTokenSpace = stspace.countTokens();



    String mspace[] = new String[nTokenSpace];


    for(int i=0;i<nTokenSpace;i++)
    {
        mspace[i] = stspace.nextToken();


    }
  for(int i=0;i<nToken;i++)
    {
       String k = mspace[i];
       int freq = 0;
       for(int x=0;x<nTokenSpace;x++)
       {
           if(k==mspace[x])
           {
               freq++;
            }
        }
        System.out.println(k+"\t"+freq);
    }

الإخراج المطلوب لـ "My.اسم.يكون.حالا.يكون.أنون." ينبغي أن يكون

My  1
Name 1
Is 2
Anon 2

But I get 
My  1
Name    1
Is  1
Anon    1
Is  1
Anon    1

لدي شعور بوجود خطأ واضح هنا ولكني لا أرى ذلك (بحاجة إلى عيون جديدة>.>)

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

المحلول

خطأك هنا:

if(k==mspace[x])

تحتاج إلى استخدام

if (k.equals(mspace[x]))

لمقارنة Stringس.

إذا كنت لا تريد التكرارات في الإخراج، يمكنك إضافة الرموز المميزة الخاصة بك إلى ملف Set قبل الحلقة:

Set<String> uniqueTokens = new LinkedHashSet<String>(Arrays.asList(mspace));
for (String k : uniqueTokens) {
    int freq = 0;
    for (int x = 0; x < nTokenSpace; x++) {
        if (k.equals(mspace[x])) {
            freq++;
        }
    }
    System.out.println(k + "\t" + freq);
}

نصائح أخرى

مقارنة السلاسل

استبدال

giveacodicetagpre.

مع

giveacodicetagpre.

لديك هذا السطر:

if(k==mspace[x])

هذا يعني أنك تقارن بين كائنين ويجب أن يكونا نفس المرجع تمامًا في الذاكرة، وليس متطابقين.ما تبحث عنه هو شيئين متطابقين.للقيام بذلك، عليك مقارنة الأشياء مع .equals(Object).

if (k.equals(mspace[x]))

فقط لإضافتها إلى الإجابات الأخرى هنا، وأعتقد أنك تحتاج أيضا إلى إزالة التكرارات من القائمة أو ستكون نتائجك مثل:

giveacodicetagpre.

لذلك يجب أن تكون كتلة إذا كان:

giveacodicetagpre.

لماذا لا تستخدم فئات التجميع.هنا هو الرمز.

giveacodicetagpre.

آمل أن يساعد ..

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