2017-01-12 7 views
-4

Meine Array-Liste soll eine Linie von Sternchen vor und nach jedem Auftreten der kleinsten Zahl enthalten. Ich habe debugged und alle Variablen halten die korrekten Werte, aber aus irgendeinem Grund addiert es nicht die Werte.ArrayList nicht Elemente hinzufügen

Hier ist mein Code:

int smallest = array[0]; 

     for (int i = 0; i < size; i++) 
      if (array[i] < smallest) 
       smallest = array[i]; 

       String smallestString = String.valueOf(smallest); 

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

     for(int i = 0;i < size; i++) 
      list.add(Integer.toString(array[i])); 


     for (int i = 0; i < list.size(); i++) 
     if (smallestString.equals(list.get(i))) { 
      list.add(i, "*****"); 
      list.add(i + 2, "*****"); 
     } 

      System.out.println("\n" + list); 

      return smallest; 
+2

Versuchen Sie Loops mit '{' '}' Blöcke begrenzen, wird es weniger Fehler sein -anfällig . – Berger

+0

Beachten Sie, dass Sie, wenn Sie von vorne nach hinten iterieren, größere Schritte ausführen müssen, da das Hinzufügen von Elementen alles nach dem aktuellen Element nach rechts verschiebt, dh wenn Ihre Liste "1,2,3" ist und dann '*' bei Index 0 und 2 ergeben '*, 1, *, 2,3' und das nächste Element (' 2') befindet sich jetzt bei Index 3. – Thomas

+0

@Thomas Deshalb habe ich 2 hinzugefügt, wenn ich die zweite Zeile hinzufüge von Sternchen. –

Antwort

-1

Ich denke, es ist besser list zu konstruieren, wie Sie gehen. Ihr Weg ein neues Element list des Einsetzens (das ist eine ArrayList Implementierung) hat zwei Probleme:

  1. Die Bibliothek ist gezwungen, alles nach dem anderen zu verschieben - das ist langsam
  2. In der Regel eine Liste ändern, während Iterieren es ist fehleranfällig.

Ich würde den Code wie folgt umschreiben:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class ArrayListInsert { 

    public static void main(String[] args) { 
     Integer[] array = new Integer[]{1, 5, 2, 6, 7}; 

     int smallest = array[0]; 

     for (int i = 0; i < array.length; i++) 
      if (array[i] < smallest) 
       smallest = array[i]; 

     String smallestString = String.valueOf(smallest); 

     List<String> list = new ArrayList<String>(); 

     for(int i = 0; i < array.length; i++) { 
      if (smallestString.equals(String.valueOf(array[i]))) { // be careful! 
       list.add("*****"); 
       list.add(Integer.toString(array[i])); 
       list.add("*****"); 
      } else { 
       list.add(Integer.toString(array[i])); 
      } 
     } 

     System.out.println("array is\n" + Arrays.deepToString(array)); 
     System.out.println("list is\n" + list); 

//   return smallest; 

    } 

} 

Der Ausgang wäre:

array is 
[1, 5, 2, 6, 7] 
list is 
[*****, 1, *****, 5, 2, 6, 7] 
+0

Wie deklarieren Sie es als 'List', aber schreiben Sie' new ArrayList'? Was ist der Unterschied zu 'deepToString' und' toString'? –

+0

@ J.melb - Dies wird absichtlich getan. Sie können sagen, "Effective Java, 2nd Ed." von Joshua Bloch, um mehr Details zu erfahren. (Punkt 52: Auf Objekte über ihre Schnittstellen verweisen) – leeyuiwah

+0

@ J.melb - Aus dem Buch ... "Allgemeiner sollten Sie die Verwendung von Interfaces anstelle von Klassen bevorzugen, um auf Objekte zu verweisen. Wenn entsprechende Interfacetypen existieren, dann Parameter, Rückgabewerte, Variablen und Felder sollten alle mit Schnittstellentypen deklariert werden. Die einzige Zeit, die Sie wirklich auf eine Objektklasse beziehen müssen, ist, wenn Sie es mit einem Konstruktor erstellen ... Wenn Sie Gewöhnen Sie sich an, Interfaces als Typen zu verwenden, Ihr Programm wird viel flexibler sein. " – leeyuiwah

Verwandte Themen