2017-08-06 9 views
2

J'essaie d'inviter l'utilisateur pour l'information et l'écrire dans un fichier texte, puis le programme lit à partir du fichier texte et il y a un compteur qui détermine la longueur de l'enregistrement du tableau. Mais je suis actuellement bloqué sur la façon dont je peux stocker chaque champ dans un tableau d'enregistrement sans définir la position du tableau. Jusqu'à présent, il réussit à lire à partir du fichier texte, mais quand j'écris dans ce fichier texte, il y aura une erreur d'erreur de pointeur nul.Comment stocker un tableau d'enregistrements dans chaque champ sans avoir à définir la position du tableau?

C'est un extrait de mon code

static class publisherDetails 
{ 
    String pubID; 
    String publisher; 
    String pubAddress; 
} 

public static void publisherDetails() throws IOException 
{ 
    File publisherMain = new File("publisherMain.txt"); 
    Scanner readpublisher = new Scanner(publisherMain); 
    publisherDetails [] publisherList = new 
    publisherDetails[countPubLines(0, publisherMain)]; 
    createPublisher(publisherList, publisherMain, readpublisher); 
    readpublisher.close(); 
    printPublisher(publisherList); 
} 

public static int countPubLines(int count, File publisherMain) throws IOException 
{ 
    Scanner countingLines = new Scanner(publisherMain); 

    while (countingLines.hasNextLine()) 
    { 
    String reading = countingLines.nextLine(); 
    count++; 
    } 

    countingLines.close(); 
    count = count/3; 
    return count; 
} 

public static void createPublisher(publisherDetails[] publisherList, File publisherMain, Scanner readpublisher) throws IOException 
{ 
while (readpublisher.hasNextLine()) 
    { 
     for (int i=0; i< publisherList.length; i++) 
     publisherList[i] = new publisherDetails(); 
     { 
      publisherList[0].pubID = readpublisher.nextLine(); 
      publisherList[0].publisher =readpublisher.nextLine(); 
      publisherList[0].pubAddress =readpublisher.nextLine(); 
      publisherList[1].pubID =readpublisher.nextLine(); 
      publisherList[1].publisher =readpublisher.nextLine(); 
      publisherList[1].pubAddress =readpublisher.nextLine(); 
      publisherList[2].pubID =readpublisher.nextLine(); 
      publisherList[2].publisher =readpublisher.nextLine(); 
      publisherList[2].pubAddress =readpublisher.nextLine(); 
      publisherList[3].pubID =readpublisher.nextLine(); 
      publisherList[3].publisher =readpublisher.nextLine(); 
      publisherList[3].pubAddress =readpublisher.nextLine(); 
     } 

    } 
    readpublisher.close(); 
} 

public static void printPublisher(publisherDetails[] publisherList) 
{ 
for (int j=0 ;j<publisherList.length; j++) 
    { 
     output("Publisher ID : " + publisherList[j].pubID); 
     output("Publisher : " + publisherList[j].publisher); 
     output("Publisher Address : " + publisherList[j].pubAddress); 
    } 

} 


public static void addPublisher() throws IOException 
{ 
    FileWriter inputPublisher = new FileWriter(new File("publisherMain.txt",true); 
    newPublisher(inputPublisher); 
} 


public static void newPublisher(FileWriter inputPublisher) throws IOException 
    { 
    Scanner scan = new Scanner(System.in); 
    output("Please enter publisher ID"); 
    String ID = scan.nextLine(); 
    inputPublisher.write("\n"+ID); 

    output("Please enter Publisher "); 
    String publisher = scan.nextLine(); 
    inputPublisher.write("\n"+publisher); 

    output("Please enter publisher Address"); 
    String pubAddress = scan.nextLine(); 
    inputPublisher.write("\n"+pubAddress); 

    scan.close(); 
    inputPublisher.close(); 
    } 
+1

Veuillez mettre plus d'effort dans le formatage de votre code. C'est vraiment difficile à lire en ce moment, avec indentation partout. Je soupçonne fortement que vous n'avez pas réellement besoin de ~ 100 lignes de code pour démontrer le problème, merci de le réduire à un [mcve]. –

+0

(Je vous recommande fortement de suivre de plus près les conventions de nommage Java - 'publisherList' n'est pas un nom de classe conventionnel.) –

+0

@JonSkeet noté, merci! Je suis assez nouveau à ce sujet alors s'il vous plaît pardonnez-moi, je vais être sûr de garder cela à l'esprit la prochaine fois! : D – lyrehcx

Répondre

1

Y at-il une raison particulière pour laquelle vous ne pouvez pas utiliser un ArrayList? Il semble assez inutile de lire le fichier entier une seule fois, juste pour déterminer la taille du tableau, puis de le lire à nouveau pour obtenir les valeurs réelles des enregistrements.

+0

Hmm, il n'y a pas de raison, mais je suis assez nouveau pour Java et je n'étais pas au courant. Ceci est un projet pour un cours de logiciel que je prends actuellement et mes connaissances en Java sont assez limitées, mais il serait utile si vous pouviez élaborer sur la façon dont je pourrais utiliser un ArrayList? Merci! : D – lyrehcx

+0

Voir la réponse d'Oguz pour un exemple. Un 'ArrayList' en Java est fondamentalement un tableau dynamique. Vous pouvez y ajouter de nouveaux éléments et le redimensionner automatiquement, vous n'avez donc pas besoin de connaître le nombre d'éléments lors de sa création. Les méthodes respectives pour cela peuvent être trouvées dans l'API. Il peut être itéré en utilisant une boucle forcée améliorée. –

0

Si vous allez chercher avec une clé à travers les données, alors je pense que vous devriez utiliser une carte. Vous devez changer les méthodes "createPublisher" et "printPublisher".

public static Map<String, publisherDetails> createPublisher(File publisherMain, Scanner readpublisher) 
     throws IOException { 

    Map<String, publisherDetails> publisherMap = new HashMap<String, publisherDetails>(); 
    publisherDetails newPublisher = new publisherDetails(); 
    while (readpublisher.hasNextLine()) { 

     newPublisher.pubID = readpublisher.nextLine(); 
     newPublisher.publisher = readpublisher.nextLine(); 
     newPublisher.pubAddress = readpublisher.nextLine(); 
     // Fill the map 
     publisherMap.put(newPublisher.pubID, newPublisher); 
     readpublisher.nextLine(); 
    } 
    readpublisher.close(); 
    return publisherMap; 
} 

public static void printPublisher(Map<String, publisherDetails> publisherMap) { 
    // loop through the whole data 
    // or you can search with key like publisherMap.get(pubId); 
    for(Map.Entry<String,publisherDetails> entry : publisherMap.entrySet()){ 

     output("Publisher ID : "  + entry.getValue().pubID); 
     output("Publisher : "   + entry.getValue().publisher); 
     output("Publisher Address : " + entry.getValue().pubAddress); 
    } 

} 

Ou vous pouvez utiliser ArrayList bien sûr. Voici comment.

public static List<publisherDetails> createPublisher(File publisherMain, Scanner readpublisher) 
     throws IOException { 

    List<publisherDetails> publisherList = new ArrayList<publisherDetails>(); 
    publisherDetails newPublisher = new publisherDetails(); 
    while (readpublisher.hasNextLine()) { 
     readpublisher.nextLine(); 
     newPublisher.pubID = readpublisher.nextLine(); 
     newPublisher.publisher = readpublisher.nextLine(); 
     newPublisher.pubAddress = readpublisher.nextLine(); 
     // Fill the list 
     publisherList.add(newPublisher); 

    } 
    readpublisher.close(); 
    return publisherList; 
} 

public static void printPublisher(List<publisherDetails> publisherList) { 
    // loop through the whole data 
    for(publisherDetails publisher : publisherList){ 

     output("Publisher ID : "  + publisher.pubID); 
     output("Publisher : "   + publisher.publisher); 
     output("Publisher Address : " + publisher.pubAddress); 
    } 

} 
+1

Généralement, mais surtout lors de l'utilisation de collections, vous devez toujours utiliser l'interface et non le type d'implémentation dans les valeurs et les paramètres de retour. Donc 'printPublisher()' devrait prendre un paramètre 'List' et' createPublisher() 'devrait renvoyer' List'. –

+0

Vous avez raison. Je l'ai édité. – Oguz

+0

J'ai essayé le code et cela fonctionne parfaitement mais quand j'essaie d'écrire de nouvelles informations dans le fichier, il n'affiche que les nouvelles informations et non les informations précédentes. – lyrehcx