سؤال

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

سؤالين:

  1. لا يبدو أنني أستطيع أن أجعل حلقة الإدخال تعمل، ما هي أفضل ممارسة للقيام بذلك.

  2. ما هو نوع الكائن الذي سيكون لطريقة القراءة؟مزدوج []، أو ArrayList؟

    1. كيف يمكنني إعلان نوع الطريقة ليكون قائمة صفيف؟

    2. كيف أمنع المصفوفة من تخزين أكثر من 1000 قيمة داخلها؟

اسمحوا لي أن أعرض ما لدي حتى الآن:

public static java.util.ArrayList readRange(double end_signal){
    //read in the range and stop at end_signal

    ArrayList input = new ArrayList();
    Scanner kbd = new Scanner( System.in );
    int count = 0;
    do{
        input.add(kbd.nextDouble());
        System.out.println(input); //debugging
        ++count;
    } while(input(--count) != end_signal);
    return input;
}

سيكون موضع تقدير أي مساعدة، العفو عن مبتدئي ...

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

المحلول

الإجابات:

>1.لا يبدو أنني أستطيع أن أجعل حلقة الإدخال تعمل، ما هي أفضل ممارسة للقيام بذلك.

أفضل أن يكون لدي حلقة بسيطة بدلاً من القيام{}بينما...ووضع الشرط في حين...في المثال الخاص بي يقرأ:

في حين أن رقم القراءة ليس إشارة نهاية والعدد أقل من الحد:يفعل.

>2.ما هو نوع الكائن الذي سيكون لطريقة القراءة؟مزدوج []، أو ArrayList؟

ArrayList، ومع ذلك فإنني أوصيك بشدة باستخدام واجهة القائمة ( java.util.List ) بدلاً من ذلك.إنها ممارسة جيدة لـ OO للبرمجة على الواجهة بدلاً من التنفيذ.

>2.1كيف يمكنني إعلان نوع الطريقة ليكون قائمة مصفوفات؟

انظر الكود أدناه.

>2.2.كيف أمنع المصفوفة من تخزين أكثر من 1000 قيمة داخلها؟

عن طريق إضافة هذا القيد في حالة while.

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;

public class InputTest{

    private int INPUT_LIMIT = 10000;

    public static void main( String [] args ) {
        InputTest test = new InputTest();
        System.out.println("Start typing numbers...");
        List list = test.readRange( 2.0 );
        System.out.println("The input was " +  list );
    }

    /**
     * Read from the standar input until endSignal number is typed.
     * Also limits the amount of entered numbers to 10000;
     * @return a list with the numbers.
     */
    public List readRange( double endSignal ) {
        List<Double> input = new ArrayList<Double>();
        Scanner kdb = new Scanner( System.in );
        int count = 0;
        double number = 0;
        while( ( number = kdb.nextDouble() ) != endSignal && count < INPUT_LIMIT ){
            System.out.println( number );
            input.add( number );
        }
        return input;
    }
}

الملاحظات الختامية:

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

في نمط كود جافا، يجب أن تكون أسماء المتغيرات في حالة الجملة كما في "endSignal" بدلاً من "end_signal"

نصائح أخرى

ما تحتاجه في حالة الحلقة الخاصة بك هو:

while ( input.get( input.size()-1 ) != end_signal );

ما تفعله هو تقليل متغير العداد.

كما يجب عليك أن تعلن ArrayList مثل ذلك:

ArrayList<Double> list = new ArrayList<Double>();

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

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

وحدة تحكم الحزمة؛

استيراد java.util.;استيراد java.util.regex.;

الطبقة العامة ArrayListInput {

public ArrayListInput() {
    // as list
    List<Double> readRange = readRange(1.5);

    System.out.println(readRange);
    // converted to an array
    Double[] asArray = readRange.toArray(new Double[] {});
    System.out.println(Arrays.toString(asArray));
}

public static List<Double> readRange(double endWith) {
    String endSignal = String.valueOf(endWith);
    List<Double> result = new ArrayList<Double>();
    Scanner input = new Scanner(System.in);
    String next;
    while (!(next = input.next().trim()).equals(endSignal)) {
        if (isDouble(next)) {
            Double doubleValue = Double.valueOf(next);
            result.add(doubleValue);
            System.out.println("> Input valid: " + doubleValue);
        } else {
            System.err.println("> Input invalid! Try again");
        }
    }
    // result.add(endWith); // uncomment, if last input should be in the result
    return result;
}

public static boolean isDouble(String in) {
    return Pattern.matches(fpRegex, in);
}

public static void main(String[] args) {
    new ArrayListInput();
}

private static final String Digits = "(\\p{Digit}+)";
private static final String HexDigits = "(\\p{XDigit}+)";
// an exponent is 'e' or 'E' followed by an optionally
// signed decimal integer.
private static final String Exp = "[eE][+-]?" + Digits;
private static final String fpRegex = ("[\\x00-\\x20]*" + // Optional leading "whitespace"
        "[+-]?(" + // Optional sign character
        "NaN|" + // "NaN" string
        "Infinity|" + // "Infinity" string

        // A decimal floating-point string representing a finite positive
        // number without a leading sign has at most five basic pieces:
        // Digits . Digits ExponentPart FloatTypeSuffix
        // 
        // Since this method allows integer-only strings as input
        // in addition to strings of floating-point literals, the
        // two sub-patterns below are simplifications of the grammar
        // productions from the Java Language Specification, 2nd
        // edition, section 3.10.2.

        // Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt
        "(((" + Digits + "(\\.)?(" + Digits + "?)(" + Exp + ")?)|" +

        // . Digits ExponentPart_opt FloatTypeSuffix_opt
        "(\\.(" + Digits + ")(" + Exp + ")?)|" +

        // Hexadecimal strings
        "((" +
        // 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt
        "(0[xX]" + HexDigits + "(\\.)?)|" +

        // 0[xX] HexDigits_opt . HexDigits BinaryExponent
        // FloatTypeSuffix_opt
        "(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" +

        ")[pP][+-]?" + Digits + "))" + "[fFdD]?))" + "[\\x00-\\x20]*");// Optional
                                                                        // trailing
                                                                        // "whitespace"

}

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

    if (!readRange.isEmpty()) {
        double last = readRange.get(readRange.size() - 1);
    }
    
  2. من الأفضل إرجاع الواجهات عند العمل مع مجموعات Java، نظرًا لوجود العديد من تطبيقات قوائم محددة (LinkedList، SynchronizedLists، ...).لذلك، إذا كنت بحاجة إلى نوع آخر من القائمة لاحقًا، فيمكنك بسهولة تغيير التنفيذ الملموس داخل الطريقة ولن تحتاج إلى تغيير أي كود إضافي.

  3. قد تتساءل عن سبب نجاح عبارة التحكم while، ولكن كما ترى، هناك أقواس حولها التالي = input.next().trim().بهذه الطريقة يتم تعيين المتغير مباشرة قبل الاختبار الشرطي.كما يلزم إجراء عملية القطع لتجنب مشكلات المسافات البيضاء

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

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

  6. لقد استخدمت عدادًا لأسباب لا أراها في الكود الخاص بك.إذا كنت تريد معرفة عدد القيم التي تم إدخالها بنجاح، فما عليك سوى الاتصال readRange.size().

  7. إذا كنت تريد العمل على مصفوفة، فإن الجزء الثاني من المُنشئ يوضح كيفية تحويلها.

  8. أتمنى ألا تخلط بيني وبين المزج المزدوج والمزدوج، ولكن بفضل ميزة Java 1.5 Auto-Boxing، لا توجد مشكلة.و كما الماسح الضوئي التالي () لن يعود أبدًا خاليًا (afaik)، فلا ينبغي أن يكون هذا مشكلة على الإطلاق.

  9. إذا كنت تريد تحديد حجم المصفوفة، استخدم

حسنًا، أتمنى أن تجد الحل والتفسيرات الخاصة بي مفيدة، استخدمها حجم النتيجة () كمؤشر والكلمة الرئيسية استراحة لترك بيان التحكم أثناء.

غريتز، غاد

**

public static java.util.ArrayList readRange(double end_signal) {

    //read in the range and stop at end_signal

    ArrayList input = new ArrayList();

    Scanner kbd = new Scanner(System. in );
    int count = 0;

    do {
        input.add(Double.valueOf(kbd.next()));
        System.out.println(input); //debugging
        ++count;
    } while (input(--count) != end_signal);
    return input;
}

**

public static ArrayList&lt;Double> readRange(double end_signal) {

    ArrayList<Double> input = new ArrayList<Double>();
    Scanner kbd = new Scanner( System.in );
    int count = 0;
    do{
        input.add(kbd.nextDouble());
        ++count;
    } while(input(--count) != end_signal);
return input;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top