سؤال

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

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

هنا هو ما أود:

عندما أحاول شيئا وهو لا يعمل مثل التلاعب التالية من مجموعة قائمة ، أريد أن أجد مكانا أو البرامج التي يمكن أن تظهر أمثلة التعليمات البرمجية من أشياء مثل إضافة طبقة إضافية سبيل المثال إلى arrayList.أين يمكنني معرفة بإيجاز عن هذا دون الحاجة إلى طرح سؤال أو 2 كل جملة خطأ ؟ أين هو جوجل جافا ؟ هل هناك برنامج سوف تتخذ أخطاء تظهر لك كيفية إصلاح لهم (أو تقديم اقتراحات)?

/tmp/jc_4083/Inventory.java:101: incompatible types
found   : RatedDVD[]
required: java.util.ArrayList
        dvdlist = temp;
                  ^
/tmp/jc_4083/Inventory.java:110: array required, but java.util.ArrayList found
            if (p != dvdlist[i]) {
                            ^
/tmp/jc_4083/Inventory.java:111: array required, but java.util.ArrayList found
                temp[i-adj] = dvdlist[i];
                                     ^
/tmp/jc_4083/Inventory.java:115: incompatible types
found   : RatedDVD[]
required: java.util.ArrayList
        dvdlist = temp;

هنا هو رمز هذه الفئة إذا كان أي شخص مهتم في النظر في ذلك بالنسبة لي:

//Contruct inv and allow for methods add, get, size, sort, and value
import java.util.*;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class Inventory
{// class Inventory
    private ArrayList<RatedDVD> dvdlist;// declare dvdlist as ArrayList of RatedDVD
    private int numDVDs;

    public Inventory()
    {// method Inventory
        dvdlist = new ArrayList<RatedDVD>();

    }// end method

    // add & get
    public RatedDVD get(int i){return dvdlist.get(i);}// method get

    public void add(DVD d){
    dvdlist = dvdlist d;
    sort();
    }// method add

    public double value()
    {// method value
        double total = 0.0;
        for (int i = 0; i < dvdlist.size(); i++) 
        {// for every pass thru dvdlist add total
        // [DEBUG] consider enhanced for
            total += get(i).feeValue();
        }
        return total;
    }// end method value

    public void sort()
    {// method sort
    // [DEBUG] consider optimization
    int n = dvdlist.size();
        for (int search = 1; search < n; search++) 
        {// for do the following and increment till dvdlist has been searched
            for (int i = 0; i < n-search; i++) 
            {// for step through comparison for entire dvdlist
                if (dvdlist.get(i).getName().compareToIgnoreCase(dvdlist.get(i+1).getName()) > 0) 
                {// if swap necessary then swap
                    RatedDVD temp = dvdlist.get(i);
                    dvdlist.set(i,dvdlist.get(i+1));
                    dvdlist.set(i+1,temp);
                }// end if swap
            }// end for compareto
        }// end outer for
    }// end method sort

    public int size(){return dvdlist.size();}// method size

    public void save() {
        save(true);
    }

    // save it to C:\data\inventory.dat
    public void save(boolean saveagain) {
        try {
            BufferedWriter w = new BufferedWriter(new FileWriter("c:\\data\\inventory.dat"));
            for (int i = 0; i < size(); i++) {
                RatedDVD dvd = get(i);
                w.write( dvd.getItem() + "\n");
                w.write( dvd.getName() + "\n");
                w.write( dvd.getRating() + "\n");
                w.write( dvd.getUnits() + "\n");
                w.write( dvd.getPrice() + "\n");
                w.write( dvd.value() + "\n");
                w.write( dvd.fee() + "\n");
                w.write( dvd.feeValue() + "\n");
                w.newLine();
            }
            // total value of it
            //w.write( value() + "\n");
            w.close();
        } catch (Exception ex) {
            if (saveagain) {
                new File("c:\\data\\").mkdir(); // make file if doesn't exist
                save(false); 
            }
        }
    }

    public int search(String name) {
        for (int i = 0; i < size(); i++) { // check if name string is equal
            if (get(i).getName().equalsIgnoreCase(name)) return i;
        }
        return -1; // we didn't find anything
    }

    // add a new dvd to the end, increasing the array size
    public void add(RatedDVD p) {
        RatedDVD[] temp = new RatedDVD[dvdlist.size()+1];
        for (int i = 0; i < dvdlist.size(); i++) {
            temp[i] = dvdlist[i];
        }
        temp[temp.length-1] = p; // add it at the end
        dvdlist = temp;
    }

    // remove a DVD from the array, and shrink the array size
    public void delete(RatedDVD p) {
        RatedDVD[] temp = new RatedDVD[dvdlist.size()-1];
        int adj = 0;
        for (int i = 0; i < dvdlist.size(); i++) {
            if (p != dvdlist[i]) {
                temp[i-adj] = dvdlist[i];
            }
            else adj = 1;
        }
        dvdlist = temp;
    }
    public int highestNumber() {
        int numb = 0;
        for (int i = 0; i < dvdlist.size(); i++) {
            if (get(i).getItem() > numb) {
                numb = get(i).getItem();
            }
        }
        return numb;
    }   
}// end class inventory
هل كانت مفيدة؟

المحلول

على dvdlist هو ArrayList, التي تنفذ جمع واجهة لا صفيف (راجع للشغل, و هذا هو المعروف باسم "البرنامج واجهة وليس التنفيذ" من حيث المبدأ ، يجب أن decalare dvdlist كما java.util.List):

private ArrayList<RatedDVD> dvdlist;// declare dvdlist as ArrayList of RatedDVD

إلقاء نظرة على طرق عن جمع واجهة, سوف تجد كل ما تحتاجه لإضافة وإزالة العناصر.

لذلك, إضافة RatedDVD, أنت لا تحتاج إلى استخدام مؤقت مجموعة من RatedDVD لن يصلح حال إلى ArrayList كما تفعلين هنا:

// add a new dvd to the end, increasing the array size
public void add(RatedDVD p) {
    RatedDVD[] temp = new RatedDVD[dvdlist.size()+1];
    for (int i = 0; i < dvdlist.size(); i++) {
            temp[i] = dvdlist[i];
    }
    temp[temp.length-1] = p; // add it at the end
    dvdlist = temp;
}

بدلا من ذلك, فقط اتصل add(Object o) طريقة dvdlist.

حذف RatedDVD سبيل المثال ، استخدام remove(Object o) طريقة dvdlist.

من أجل البحث (طريقة) ، النظر في استخدام contains(Object o) على dvdlist.

إذا كنت بحاجة إلى تكرار عبر مجموعة ، مكرر:

for (Iterator iter = dvdlist.iterator(); iter.hasNext();) {
   RatedDVD ratedDVD = (RatedDVD) iter.next();
   //rest of the code block removed
}

أو حتى أسرع الآن مع جافا 5+ و الأدوية:

for (RatedDVD ratedDVD : dvdlist) {
   // rest of the code here
}

حقا, تحتاج إلى حفر على مجموعة الإطار.

نصائح أخرى

ويبدو أن الأخطاء مترجم أن يكون وصفي تماما ما تفعلونه خطأ، ولكن أستطيع أن أرى لماذا قد يكون الخلط حول كيفية القيام بذلك الحق. يبدو أنك سوء فهم كيف هو المقصود من ArrayList لاستخدامها. إذا نظرتم الى مستندات ، سترى أن لديها طرق add() وremove() أن تفعل العمليات التي قمت بإنشائها طرق add() وdelete() ل. كنت تحاول علاج ArrayList كما لو أنها مجموعة الخام. لا تفعل ذلك. استخدم الطرق التي توفرها API. وليس هذا فقط حل الأخطاء، ولكنه سيجعل نظافة التعليمات البرمجية وأوضح أن المبرمجين في المستقبل.

والواقع أن الخطأ مترجم واضح جدا:

/tmp/jc_4083/Inventory.java:101: incompatible types
found   : RatedDVD[]
required: java.util.ArrayList
        dvdlist = temp;

وتقول "أنواع غير متوافقة"، وأنه يتوقع java.util.ArrayList ولكن وجدت بدلا من ذلك RatedDVD[].

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

وهكذا لا يمكنك تعيين صفيف إلى بنسب مختلفة من القائمة نوع. اما أن يكون لاتخاذ قرار بشأن استخدام واحد فقط من هذين النوعين في جميع أنحاء البرنامج، أو كان لديك لتحويل بينهما يدويا، وذلك باستخدام أساليب مثل java.util.Arrays.asList() وList.toArray().

ويبدو أن تحاول أن تفعل أشياء متقدمة جدا بسرعة كبيرة - ربما يجب عليك النظر في صن <لأ href = "http://java.sun.com/docs/books/tutorial/" يختلط = "نوفولو noreferrer "> دروس جافا أولا - على الرغم من أنها شامل جدا ويمكن أيضا أن تستخدم كمرجع ليبحث عن تفاصيل اللغة. وهناك أيضا قسم حول التحويل بين مجموعات والمصفوفات .

وأقترح عليك استخدام IDE (مثل الكسوف، خال تماما). وسوف تساعدك من خلال بناء الجملة API بجعل اقتراحات أثناء الكتابة، وتظهر لك أخطاء عند كتابتها، بحيث يمكنك تحديد أخطاء في بناء الجملة بالضبط ونسأل عنهم. من حيث الطلب، وهذا هو ما هو ستاكوفيرفلوو ل.

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

وهكذا، المشكلة هنا هي أنك تحاول الوصول إلى ArrayList مثل صفيف، وهو غير صحيح لأن جافا لا تفعل أشياء من هذا القبيل. تحتاج إلى استخدام list.get (ط) للحصول على عنصر إيث في صفيف. وبالمثل، عندما حاولت تعيين متغير ArrayList إلى صفيف، حصلت على المترجم في جنون لك. تحتاج إلى إنشاء ArrayList جديد مع محتويات مؤقت ثم قم بتعيين dvdlist إلى ذلك، على سبيل المثال. dvdlist = new ArrayList<RatedDVD>(temp);.

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

ويبدو أنك الخلط عن الفرق بين مجموعة وArrayList. المصفوفة هي قائمة ثابتة من العناصر، وهي التي شيدت باستخدام [] حرف. وArrayList هو كائن في نظام المجموعات في جاوة أن يتصرف مثل مجموعة من حجم قابل للتعديل - أي أنه يمكن فهرستها في، ويمكن أن يضاف على، وإدراجها، وما إلى ذلك فهي لا interchangable

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

.

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

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

تحليل حاول التفكير في وجوه المنحى ...

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

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

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

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

ولقد كان على الأرجح هنا، ولكن هذه هي الأشياء التي يمكنك القيام به مع ArrayList على . وكان لديك ArrayList<RatedDVD> الذي يقيد أبعد ما يمكنك القيام به معها. محاولة لفهم هذا أولا، ثم إصلاح البرنامج للعمل مع عمليات المتاحة على كائن ArrayList.

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