سؤال

وأنا أحاول كتابة برنامج صغير بطباعة الأرقام المميزة في صفيف. على سبيل المثال إذا قام مستخدم بإدخال 1،1،3،5،7،4،3 يطبع البرنامج الوحيد للخروج 1،3،5،7،4.

وأنا الحصول على خطأ على آخر إذا خط في checkDuplicate وظيفة.

وهنا رمز بلادي حتى الآن:

import javax.swing.JOptionPane;

public static void main(String[] args) {
    int[] array = new int[10];
    for (int i=0; i<array.length;i++) {
        array[i] = Integer.parseInt(JOptionPane.showInputDialog("Please enter"
                                  + "an integer:"));
    }
    checkDuplicate (array);
}

public static int checkDuplicate(int array []) {
    for (int i = 0; i < array.length; i++) {
        boolean found = false;
        for (int j = 0; j < i; j++)
            if (array[i] == array[j]) {
                found = true;
                break;
            }
        if (!found)
            System.out.println(array[i]);
    }
    return 1;
}
}
هل كانت مفيدة؟

المحلول

وأولا وقبل كل شيء، و"else if" بيان غير صحيح، لأنك لا توفر أي شرط للو (إذا كنت تريد إذا، تحتاج إلى كتابة "if (condition) ...").

وثانيا، أنت لا تستطيع أن تقرر <م> داخل الحلقة الداخلية ، إذا يجب أن تكون مطبوعة قيمة: الطريقة التي يعمل التعليمات البرمجية تكتب مجموعة قيمة [ط] <م> لكل مجموعة قيمة [ي] الذي يختلف من مجموعة [أنا]!

ثالثا: الحلقة الداخلية تحتاج فقط إلى الانتقال من 0 إلى i-1 مؤشر الخارجي: لكل عنصر، ما عليك سوى أن تقرر، إذا كان هذا هو التواجد الأول (أي إذا حدثت نفس القيمة في أي مؤشر السابق أم لا) . إذا كان كذلك، طباعته، إن لم يكن، وتجاهل ذلك.

ووالتنفيذ السليم لCheckDuplicate() ستكون كما يلي:

public static void checkDuplicate(int array []) {
  for (int i = 0; i < array.length; i++) {
    boolean found = false;
    for (int j = 0; j < i; j++)
      if (array[i] == array[j]) {
        found = true;
        break;
      }
    if (!found)
      System.out.println(array[i]);
  }
}

ولكن بطبيعة الحال، فإن نوعا من Set تكون أكثر كفاءة للصفائف أكبر ...


وتحرير: وبطبيعة الحال، <م> mmyers (انظر التعليقات) هو الحق بالقول، أنه منذ CheckDuplicate() لا يرجع أي قيمة، فإنه ينبغي أن يكون نوع الإرجاع void (بدلا من int). I تصحيح هذا في رمز أعلاه ...

نصائح أخرى

وأبسط طريقة سيكون لإضافة كل العناصر إلى Set<Integer> وبعد ذلك فقط طباعة محتويات Set.

وضعها في مجموعة بأمر من وقت الإدراج، ثم تحويل إلى مجموعة إذا لزم الأمر.

new LinkedHashSet<Integer>(array).toArray()

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

وماذا تريد ويمكن تحقيق ذلك باستخدام API جمع جافا، ولكن ليس تماما كما على الخطوط الملاحية المنتظمة واحدة، وذلك بسبب حقيقة طرق جمع تعمل مع Objects وليس الأوليات. J2SE يفتقر إلى الأساليب التي تحول، مثلا، int[] إلى Integer[]، ولكن أباتشي العموم لانج مكتبة يحتوي على مثل هذه الأساليب مفيدة ، مثل ArrayUtils .toObject () و <لأ href = "http://commons.apache.org/lang/api-release/org/apache/commons/lang/ArrayUtils.html#toPrimitive (java.lang.Integer [ ]) "يختلط =" نوفولو noreferrer "> ArrayUtils.toPrimitive () .

واستخدامها، وطريقة لإزالة العناصر المكررة من مجموعة صحيحا يبدو شيئا من هذا القبيل:

public static int[] removeDuplicates(int... array) {
    Integer[] ints = ArrayUtils.toObject(array);
    Set<Integer> set = new LinkedHashSet<Integer>(Arrays.asList(ints));
    return ArrayUtils.toPrimitive(set.toArray(new Integer[set.size()]));
}

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

وربما يكون من الأفضل لإضافة كل رقم إلى <لأ href = "http://java.sun.com/j2se/1.4.2/docs/api/java/util/Set.html" يختلط = " نوفولو noreferrer "> تعيين التنفيذ بدلا من صفيف. مجموعات هي خصيصا لتخزين مجموعة من العناصر التي تريد تصفية مكررة.

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

وjava.util.Scanner الاستيراد؛ PrintDistinctNumbers الطبقة العامة {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    int [] numberArray = createArray();
    System.out.println("The number u entered are:   ");
    displayArray(numberArray);
    getDistinctNumbers(numberArray);
}

public static int[] createArray() {
    Scanner input = new Scanner(System.in);
    int [] numberCollection = new int [10];
    System.out.println("Enter 10 numbers");

    for(int i = 0; i < numberCollection.length; i++){
        numberCollection[i] = input.nextInt();
    }
    return numberCollection;

}

public static void displayArray(int[] numberArray) {
    for(int i = 0; i < numberArray.length; i++){
        System.out.print(numberArray[i]+" ");
    }
}

public static void getDistinctNumbers(int[] numberArray) {
    boolean isDistinct = true;
    int temp = 0;
    int [] distinctArrayNumbers = new int [10];
    for ( int i = 0; i < numberArray.length; i++){
        isDistinct = true;
            temp = numberArray[i];

            for( int j = 0; j < distinctArrayNumbers.length; j++){
                if( numberArray[i] == distinctArrayNumbers[j] ){
                isDistinct = false;
            }


           }
            if(isDistinct){
                    distinctArrayNumbers[temp]=numberArray[i];
                    temp++;
                }


    }
    displayDistinctArray(distinctArrayNumbers);
}

public static void displayDistinctArray(int[] distinctArrayNumbers) {
    for( int i = 0; i < distinctArrayNumbers.length; i++){
        if(distinctArrayNumbers[i] != 0){
        System.out.println(distinctArrayNumbers[i]);
        }
    }
}

و}

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