0

こんにちは、私は現在、ユーザーが配列を作成し、配列を検索し、配列から要素を削除できるようにするプログラムを作成しています。メソッドを見るとLibraryMenu、switch ステートメントで配列を作成する最初のケースは正常に動作しますが、他のケースではコンパイルしようとすると「シンボルが見つかりません」というエラーが発生します。

私の質問は、検索関数と削除関数が最初のスイッチ ケース (ライブラリ配列の作成) を参照するようにしたいということです。たとえそれが単純な間違いによるものであっても、どんな助けも大歓迎です。

import java.util.*;
public class EnterLibrary
{

public static void LibraryMenu()
    {
        java.util.Scanner scannerObject =new java.util.Scanner(System.in);
        LibraryMenu Menu = new LibraryMenu();
        Menu.displayMenu();
        switch (scannerObject.nextInt() )
        {
            case '1':
            {
                System.out.println ("1 - Add Videos");
                Library[] newLibrary;
                newLibrary = createLibrary();
            }
            break;
            case '2':
                System.out.println ("2 - Search Videos");
                searchLibrary(newLibrary);
                break;
            case '3':
            {
                System.out.println ("3 - Change Videos");
                    //Change video method TBA
            }
            break;      
            case '4':
                System.out.println ("4 - Delete Videos");
                deleteVideo(newLibrary);
                break;
            default:
                System.out.println ("Unrecognized option - please select options 1-3 ");
                break;
        }
    }

public static Library[] createLibrary()
{
    Library[] videos = new Library[4];
    java.util.Scanner scannerObject =new java.util.Scanner(System.in); 
    for (int i = 0; i < videos.length; i++)
    {
        //User enters values into set methods in Library class
        System.out.print("Enter video number: " + (i+1) + "\n");
        String number = scannerObject.nextLine();
        System.out.print("Enter video title: " + (i+1) + "\n");
        String title = scannerObject.nextLine();
        System.out.print("Enter video publisher: " + (i+1) + "\n");
        String publisher = scannerObject.nextLine();
        System.out.print("Enter video duration: " + (i+1) + "\n");
        String duration = scannerObject.nextLine();
        System.out.print("Enter video date: " + (i+1) + "\n");
        String date= scannerObject.nextLine();
        System.out.print("VIDEO " + (i+1) + " ENTRY ADDED " + "\n \n");
        //Initialize arrays
        videos[i] = new Library ();
        videos[i].setVideo( number, title, publisher, duration, date  );
    }
    return videos;
}

public static void printVidLibrary( Library[] videos)
{
    //Get methods to print results
    System.out.print("\n======VIDEO CATALOGUE====== \n");
    for (int i = 0; i < videos.length; i++)
    {
        System.out.print("Video number " + (i+1) + ": \n" + videos[i].getNumber() + "\n ");
        System.out.print("Video title " + (i+1) + ": \n" + videos[i].getTitle() + "\n ");
        System.out.print("Video publisher " + (i+1) + ": \n" + videos[i].getPublisher() + "\n ");
        System.out.print("Video duration " + (i+1) + ": \n" + videos[i].getDuration() + "\n ");
        System.out.print("Video date " + (i+1) + ": \n" + videos[i].getDate() + "\n ");
    }
}

public static Library searchLibrary( Library[] videos)
{
    //User enters values to setSearch
    Library titleResult = new Library();
    java.util.Scanner scannerObject =new java.util.Scanner(System.in); 
    for (int n = 0; n < videos.length; n++)
    {
        System.out.println("Search for video number:\n");
        String newSearch = scannerObject.nextLine();
        titleResult.getSearch( videos, newSearch);

        if (!titleResult.equals(-1))
        {
        System.out.print("Match found!\n" + newSearch + "\n");
        }
        else if (titleResult.equals(-1))
        {
        System.out.print("Sorry, no matches found!\n");
        }
    }
    return titleResult;
}

public static void deleteVideo( Library[] videos)
{
    Library titleResult = new Library();
    java.util.Scanner scannerObject =new java.util.Scanner(System.in); 
    for (int n = 0; n < videos.length; n++)
    {
        System.out.println("Search for video number:\n");
        String deleteSearch = scannerObject.nextLine();
        titleResult.deleteVideo(videos, deleteSearch);
        System.out.print("Video deleted\n");
    }
}



public static void main(String[] args)
{
    Library[] newLibrary;

    new LibraryMenu();
}
}
4

4 に答える 4

2

これはひどい設計だと思います。ユーザー インターフェイス、ロジック、データ構造など、あまりにも多くのものを混ぜ合わせてしまいました。

からあなたを分離することLibraryArrayから始めますLibraryMenu。スイッチ、入力、または出力がまったく表示されないはずです。

Java はオブジェクト指向言語です。オブジェクトの観点からシステムについて考え始めます。Videoやのようなクラスは見当たりませんVideoCatalog。このシステムを作成すると、実装がはるかに簡単になることがわかります。

あなたは始めたようです:

package model;

public class Video {
    private Long id;
    private String title;
    private String publisher;
    private int durationSeconds;
    private Date publicationDate;
    // add ctors, getters, etc.  Immutable?  Could be...
    // equals, hash code, toString
}

VideoCatalog をユーザー インターフェイスや I/O から解放します。

package model;

public interface VideoCatalog {
    List<Video> find();
    List<Video> find(String title);
    List<Video> find(Date startDate, Date endDate) ;
    Long save(Video video);
    void update(Video video);
    void delete(Video video);
}

これで、必要なデータ構造を使用する実装を作成できます。

package model;

public class VideoCatalogImpl implements VideoCatalog {
    private Set<Video> videos; 
    // add implementations here.
}
于 2012-06-10T16:30:20.140 に答える
1

caseその配列変数の宣言を最初の のスコープの外に移動し、他のケースがそれを見ることができる場所まで移動する必要があります。コードの現在の構造を考えると、それをクラスの静的メンバーにするのが最も便利です。つまり、

public class EnterLibrary
{
    Library[] newLibrary;

次に、このクラスのすべての静的メソッドが 1 つの変数を共有できます。ただし、他のメソッドに表示される変数の他のすべての宣言を必ず削除してください。そうしないと、別の変数を使用したままになり、そのようなバグを追跡するのが非常に困難になる可能性があります。

于 2012-06-10T16:29:52.550 に答える
0

Library[] newLibrary;ケース「1」でのみ定義されているため、LibraryMenuメソッドのように、より広い範囲で定義する必要があります。また、Library[] newLibraryメインで宣言された はどこにも呼び出されないため、検索に Null チェックを追加し、削除メソッドを出力する必要があります。

コンストラクター クラスは、クラスと同じ名前である必要があり、修飾子キーワードが含まれていてはなりません。また、クラスのオブジェクトを作成すると、そこで宣言された静的メソッドは使用されません。

int注: 独自に宣言された配列を使用する場合は、配列の実際のサイズを追跡するために変数を宣言することをお勧めします。array.length配列に既に含まれているアイテムの数ではなく、配列に含めることができるアイテムの数を返すことに注意してください。

私はあなたの定義(コードではなく)を次のように再設計します:

//Note I changed the classname from EnterLibrary to LibraryMenu. Apparently you
//wanted a LibraryMenu class.
public class LibraryMenu {

    private final int MAX_ITEMS = 50;
    private Library[] videos;
    private int size = 0;

    //remove the static and void keyworkds from this method, so this will be 
    //the constructor.
    public LibraryMenu() {
        videos = new Library[MAX_ITEMS];
        //the rest of your code here...
        switch (scannerObject.nextInt()) {
        //if you're reading an int, keep the constants in the case as int.
        case 1: 
            //no need of brackets inside a case statement
            //check that you can add an item in your Library array
            //also, its not good to ask the user to add 4 (or N) videos in 1 round :).
            if (size < MAX_ITEMS) {
                Library video = addVideo();
                videos[size++] = video;
            }
            break;
        case 2:
            break;
        }
    }

    //remove the static keyword so the instance of your class can call the method.
    public Library addVideo() {
        Library video = new Library();
        //your code to read data goes here...
        //then fulfill the video and return it.
        return video;
    }

    //The Library[] videos is declared in your class, so all other methods could
    //use it without having to receive it as a parameter.
    public void printVidLibrary() {
        //your code goes here...
    }

    public Library searchLibrary() {
        //your code goes here...
    }

    public void deleteVideo( Library[] videos) {
        //your code goes here...
    }

    public static void main(String[] args) {
        new LibraryMenu();
    }
}
于 2012-06-10T16:46:06.380 に答える
0

これを試して、

Library[] newLibrary; as an instance variable (at class scope)、または を宣言しますas local variable before the switch statement

于 2012-06-10T16:30:49.880 に答える