2017-06-20 2 views
1

Ich schreibe einen Code in Bezug auf Primzahlen zu finden, und es funktionierte großartig, bis ich erkannte, dass ich jede Zahl in der ArrayList durch alle Zahlen teilen musste, die davor kamen (z ArrayList war {1, 2, 3, 4, 5} Ich möchte 5 durch 4, 3, 2 und 1 teilen; 4 durch 3, 2 und 1 usw.)For Loops Absturz meiner Android App

Weil der Inhalt der ArrayList variieren je nachdem, was eingegeben der Benutzer der App, dachte ich, die beste Art und Weise zu tun zu gehen, was ich ist dies benötigt:

public class DisplayMessageActivity extends MainActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_display_message); 

    Intent intent = getIntent(); 
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE); 
    int limit = Integer.parseInt(message); 

    ArrayList<Integer> finalPrime = new ArrayList<>(); 
    ArrayList<Integer> primeNumber = new ArrayList<>(); 

    for (int i = 1; i <= limit; i++) { 

     if (!(i % 2 == 0 || i % 3 == 0 || i % 5 == 0 || i % 7 == 0)) 
      primeNumber.add(i); 
    } 

    for (int k = 0; k <= limit; k++) { 
     for (int j = 0; j <= k; j++) { 
      int a = primeNumber.get(k) % primeNumber.get(j); 
      if (!(a == 0)) { 
       finalPrime.add(k); 
       break; 
      } 
     } 
    } 

     String primes = primeNumber.toString(); 

     TextView textView = (TextView) findViewById(R.id.textView); 
     textView.setText(primes); 
    } 
} 

‚message‘ ist die Zahl, die die Benutzereingaben in die Textbox

am Anfang, was die Grenze setzt für wie hoch wollen sie die Primzahlen zählen?

Android Dev Studio IDE sagt nicht, dass es in meinem Code irgendwelche Fehler gibt, und logisch sollte es funktionieren, aber wenn ich versuche, es im Gerätesimulator auszuführen, stürzt die App ab, nachdem ich auf die Schaltfläche "Senden" geklickt habe, Dann werden die Aktivitäten auf DisaplayMessageActivity umgeschaltet.

Ich nahm die verschachtelten for-Schleifen heraus, und der Code lief perfekt und ohne Fehler, also meine Fragen sind: (a) Gibt es einen effizienteren Weg zu tun, was ich zu tun beabsichtige; und (b) warum funktioniert mein Code nicht?

Edit: Hier ist die LogCat zum Zeitpunkt des Absturzes

06-20 13:09:57.459 12826-12826/com.example.name.primenumberfinder E/AndroidRuntime: FATAL EXCEPTION: main 
                          Process: com.example.name.primenumberfinder, PID: 12826 
                          java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.name.primenumberfinder/com.example.name.primenumberfinder.DisplayMessageActivity}: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 
                           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 
                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
                           at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
                           at android.os.Handler.dispatchMessage(Handler.java:102) 
                           at android.os.Looper.loop(Looper.java:154) 
                           at android.app.ActivityThread.main(ActivityThread.java:6077) 
                           at java.lang.reflect.Method.invoke(Native Method) 
                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 
                          Caused by: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 
                           at java.util.ArrayList.get(ArrayList.java:411) 
                           at com.example.name.primenumberfinder.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:32) 
                           at android.app.Activity.performCreate(Activity.java:6662) 
                           at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
                           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 
                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)  
                           at android.app.ActivityThread.-wrap12(ActivityThread.java)  
                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)  
                           at android.os.Handler.dispatchMessage(Handler.java:102)  
                           at android.os.Looper.loop(Looper.java:154)  
                           at android.app.ActivityThread.main(ActivityThread.java:6077)  
                           at java.lang.reflect.Method.invoke(Native Method)  
                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)  
                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)  
+0

Bitte senden Sie das logcat zum Zeitpunkt des Absturzes zu – Lal

+0

Die Anzahl der Elemente in 'primeNumbers' ist deutlich weniger als' limit'. Außerordentliche Array-Ausnahme. – Compass

+0

Sie erhalten eine 'IndexOutOfBoundsException' in' DisplayMessageActivity.java' Zeilennummer: 32 – Lal

Antwort

1

Code ändert für jede Zahl in Array-Liste mit Rest der Elemente dividiert (Anzahl). Hier ist der Code

int n = primeNumber.size(); 
for (int k = 0; k <n-1; k++) { 
     for (int j = 0; j <n-k-1; j++) { 
      int a = primeNumber.get(j) % primeNumber.get(j+1); 
      if (a != 0) { 
       finalPrime.add(k); 
       break; 
      } 
     } 
    }