java:使用抽象数据类型

时间:2016-12-06 01:17:27

标签: java loops arraylist abstract-data-type

首先,我不确定我是否在这个问题的标题中传达了正确的问题,如果是的话,我道歉。

我的问题是这个 - 我正在使用列表ADT来模拟选择游戏。这个想法是一群孩子围成一圈,唱着韵。每个孩子都说到押韵的一个字,直到押韵完成。说韵的最后一个人不在游戏中。然后从下一个孩子开始押韵。离开的最后一个孩子是胜利者。

应用程序将读取游戏中的玩家数量和键盘上的押韵。将创建两个列表,一个用于玩家,一个用于押韵。 arraylists使用方法的接口。

我正在编写代码以循环遍历两个列表,至少一次(我认为),以便与韵文一起运行玩家,找到谁将被淘汰。一旦该人被淘汰,玩家列表将缩小一个(押韵列表保持不变),循环将重新开始。

这是doRhyme()方法。

到目前为止,我遇到的问题是当我在代码中运行我所拥有的内容时,我的回报就是:

Please enter the number of players
(It should be an integer value greater than or equal to 2):5
The players list is:   1  2  3  4  5
Please enter a rhyme:
One Two Three Four Five
Player 1: One
Player 2: Two
Player 5: Three
Player null: Four
Player null: Five
Rhyme performance error!
The players list is:   5

The winner is: 5

我使用One Two Three Four Five作为测试代码的押韵。我希望这不会让任何人感到困惑。

输出代码应该如下所示:

Please enter the number of players
(It should be an integer value greater than or equal to 2):5
The players list is:   1  2  3  4  5
Please enter a rhyme: One Two Three Four Five
Player 1: One
Player 2: Two
Player 3: Three
Player 4: Four
Player 5: Five
Removing player 5
The players list is:   1  2  3  4

Player 1: One
Player 2: Two
Player 3: Three
Player 4: Four
Player 1: Five
Removing player 1
The players list is:   2  3  4

and so on until only one player is left....

此处包含的代码到目前为止。任何帮助将不胜感激。在此期间,我将继续找出正确的代码。

    public class RhymeGame
    {
        public static void main(String args[])
        {
            ListInterface<Integer> players = null;
            ListInterface<String> rhyme = null;

            int max;
            int position = 1;

            max = getInt();
            players = new AList<Integer>();

            for(int i = 1; i <= max; i++)
            {
                players.add(i);
            }

            System.out.println("The players list is: " + players);

            rhyme = getRhyme();

            while(players.getLength() > 1)
            {
                position = doRhyme(players, rhyme, position);

                System.out.println("The players list is: " + players);
                System.out.println();  
            }

            System.out.println("The winner is: " + players.getEntry(1));

        }//end of main

        //Requires user to input the number of players.
        private static int getInt()
        {
            Scanner input;
            int result = 10;        //default value is 10

            try
            {
                System.out.print("Please enter the number of players\n(It should be an integer value greater than or equal to 2):");
                input = new Scanner(System.in);
                result = input.nextInt();
            }
            catch(NumberFormatException e)
            {
                System.out.println("Could not convert input to an integer");
                System.out.println(e.getMessage());
                System.out.println("Will use 10 as the default value");
            }        
            catch(Exception e)
            {
                System.out.println("There was an error with System.in");
                System.out.println(e.getMessage());
                System.out.println("Will use 10 as the default value");
            }

            return result;

        }//end of getInt

        //Requires user to input a rhyme
        //(does not necessarily have to rhyme)
        private static ListInterface<String> getRhyme()
        {
            Scanner input;
            Scanner rhymeWords;
            String inString;

            ListInterface<String> rhyme = new AList<String>();

            try
            {
                input = new Scanner(System.in);

                System.out.println("Please enter a rhyme:");

                inString = input.nextLine().trim();
                rhymeWords = new Scanner(inString);

                while(rhymeWords.hasNext())
                {
                    rhyme.add(rhymeWords.next());
                }
            }
            catch(Exception e)
            {
                System.out.println("Input error!");
                System.out.println(e.getMessage());
                getRhyme();
            }

            //At least one word in the rhyme
            if(rhyme.getLength() < 1)
            {
                System.out.println("You must enter at least one word in the rhyme");
                getRhyme();
            }

            return (ListInterface<String>)rhyme;

        }//end of getRhyme

        //Loops through the rhyme with the players in the list, 
        //removing the selected player at the end of the rhyme.
        //
        //players = the list holding the players
        //rhyme = the list holding the words of the rhyme
        //startAt = a position to start the rhyme at
        //
        //the position of the player eliminated will be returned.
        public static int doRhyme(ListInterface<Integer> players, ListInterface<String> rhyme, int startAt)
        {   
            int numPlayers;

            try
            {
                numPlayers = players.getLength();

                while(numPlayers > 2)
                {
                    for(startAt = 1; startAt < players.getLength(); startAt++)
                    {
                        for(startAt = 1; startAt < rhyme.getLength() + 1; startAt++)
                        {
                            System.out.println("Player " + players.getEntry(startAt) + ": " + rhyme.getEntry(startAt));
                            numPlayers = players.remove(--numPlayers);
                        }                   
                    }
                }
            }
            catch(Exception e)
            {
                System.out.println("Rhyme performance error!");
            }

            return startAt;

         }//end of doRhyme

    }//end of class

列表的界面如下(如果有人想看到我必须使用的方法)。

    /** 
        An interface for the ADT list.
        Entries in the list have positions that begin with 1.
    */
    public interface ListInterface<T>
    {

       /** Adds a new entry to the end of this list.
           Entries currently in the list are unaffected.
           The list's size is increased by 1.
           @param newEntry the object to be added as a new entry */
       public void add(T newEntry);

       /** Adds a new entry at a specified position within this list.
           Entries originally at and above the specified position
           are at the next higher position within the list.
           The list's size is increased by 1.
           @param newPosition  an integer that specifies the desired
                               position of the new entry
           @param newEntry  the object to be added as a new entry
           @return true if the addition is successful, or
                   false if newPosition < 1, or newPosition > getLength() + 1 */
       public boolean add(int newPosition, T newEntry);

       /** Removes the entry at a given position from this list.
           Entries originally at positions higher than the given
           position are at the next lower position within the list,
           and the list's size is decreased by 1.
           @param givenPosition  an integer that indicates the position of
                                 the entry to be removed
           @return a reference to the removed entry or null, if either
                   the list was empty, givenPosition < 1, or
                   givenPosition > getLength() */
       public T remove(int givenPosition);

       /** Removes all entries from this list. */
       public void clear();

       /** Replaces the entry at a given position in this list.
           @param givenPosition  an integer that indicates the position of
                                 the entry to be replaced
           @param newEntry  the object that will replace the entry at the
                            position givenPosition
           @return true if the replacement occurs, or false if either the
                   list is empty, givenPosition < 1, or
                   givenPosition > getLength() */
       public boolean replace(int givenPosition, T newEntry);

       /** Retrieves the entry at a given position in this list.
           @param givenPosition  an integer that indicates the position of
                                 the desired entry
           @return a reference to the indicated entry or null, if either
                   the list is empty, givenPosition < 1, or
                   givenPosition > getLength() */
       public T getEntry(int givenPosition);

       /** Sees whether this list contains a given entry.
           @param anEntry the object that is the desired entry
           @return true if the list contains anEntry, or false if not */
       public boolean contains(T anEntry);

       /** Gets the length of this list.
           @return the integer number of entries currently in the list */
       public int getLength();

       /** Sees whether this list is empty.
           @return true if the list is empty, or false if not */
       public boolean isEmpty();

       /** Retrieves all entries that are in this list in the order in which
           they occur in the list. */
       public T[] toArray();  
    }

AList的定义如下:

    /**
       A class that implements the ADT list by using an array.
       The list is unbounded.
     */
    public class AList<T> implements ListInterface<T>
    {
        private T[] list;   // array of list entries
        private int numberOfEntries;
        private static final int DEFAULT_INITIAL_CAPACITY = 25;  

        public AList()
        {
            this(DEFAULT_INITIAL_CAPACITY);

        }//end of constructor

        public AList(int initialCapacity)
        {
            numberOfEntries = 0;
            T[] tempList = (T[])new Object[initialCapacity];
            list = tempList;

        }//end of constructor

        public void add(T newEntry)
        {
            boolean isSuccessful = true;

            if(!isFull())
            {
                //ensureCapacity();
                list[numberOfEntries] = newEntry;
                numberOfEntries++;
            }
            else
            {
                isSuccessful = false;
            }

        }//end of add

        public boolean add(int newPosition, T newEntry)
        {
            boolean isSuccessful = true;

            if(!isFull() && (newPosition >= 1) && (newPosition <= numberOfEntries + 1)) 
            {   
                ensureCapacity();
                makeRoom(newPosition);              
                list[newPosition - 1] = newEntry;
                numberOfEntries++;
            }
            else
            {
                isSuccessful = false;
            }

            return isSuccessful;

        }//end of add overload

        public T remove(int givenPosition)
        {        
            T result = null; // return value

            if((givenPosition >= 1) && (givenPosition <= numberOfEntries))                                            
            {   
                assert !isEmpty();

                result = list[givenPosition - 1]; // get entry to be removed

                // move subsequent entries towards entry to be removed, 
                // unless it is last in list
                if(givenPosition < numberOfEntries)
                {
                    removeGap(givenPosition);
                }

                numberOfEntries--;

            } // end if

            return result; // return reference to removed entry, or
            // null if either list is empty or givenPosition
            // is invalid

        }//end of remove

        public void clear()
        {

            for(int index = 0; index < numberOfEntries; index++)
            {
                list[index] = null;
            }

            numberOfEntries = 0;

        }//end of clear

        public boolean replace(int givenPosition, T newEntry)
        {
            boolean isSuccessful = true;

            if(!isFull() && (givenPosition >= 1) && (givenPosition <= numberOfEntries)) // test catches empty list
            {
                assert !isEmpty();
                list[givenPosition - 1] = newEntry;
            }
            else
            {
                isSuccessful = false;
            }

            return isSuccessful;

        }//end of replace

        public T getEntry(int givenPosition)
        {
            T result = null; // result to return

            if((givenPosition >= 1) && (givenPosition <= numberOfEntries))
            {
                assert !isEmpty();
                result = list[givenPosition - 1];
            }

            return result;

        }//end of getEntry

        public boolean contains(T anEntry)
        {
            boolean found = false;

            for(int index = 0; !found && (index < numberOfEntries); index++)
            {
                if(anEntry.equals(list[index]))
                {
                    found = true;
                }
            }

            return found;

        }//end of contains

        public int getLength()
        {
            return numberOfEntries;

        }//end of getLength

        public boolean isEmpty()
        {
            return numberOfEntries == 0;

        }//end of isEmpty

        public boolean isFull()
        {
            return numberOfEntries == list.length;
        }

        public T[] toArray()
        {
            T[] result = (T[])new Object[numberOfEntries];

            for(int index = 0; index < numberOfEntries; index++)
            {
                result[index] = list[index];
            }

            return result;

        }//end of toArray

        public String toString()
        // Returns a nicely formatted string that represents this list.
        {
            String listString = "";

            for(int i = 0; i < numberOfEntries; i++)
            {
                listString = listString + "  " + list[i];
            }

            return listString;

        }//end of toString

        // Doubles the size of the array list if it is full.
        private void ensureCapacity()
        {
            if(numberOfEntries == list.length)
            {
                list = Arrays.copyOf(list, 2 * list.length);
            }

        }//end of ensureCapacity

        //  Makes room for a new entry at newPosition.
        //  Precondition: 1 <= newPosition <= numberOfEntries + 1; 
        //                numberOfEntries is list's length before addition. 

        private void makeRoom(int newPosition)
        {
            assert(newPosition >= 1) && (newPosition <= numberOfEntries + 1);

            int newIndex = newPosition - 1;
            int lastIndex = numberOfEntries - 1;

            // move each entry to next higher index, starting at end of
            // list and continuing until the entry at newIndex is moved
            for(int index = lastIndex; index >= newIndex; index--)
            {
                list[index + 1] = list[index];
            }

        }//end of makeRoom

        // Shifts entries that are beyond the entry to be removed to the 
        // next lower position.
        //  Precondition: 1 <= givenPosition < numberOfEntries;
        //                numberOfEntries is list's length before removal. 

        private void removeGap(int givenPosition)
        {
            assert(givenPosition >= 1) && (givenPosition < numberOfEntries);

            int removedIndex = givenPosition - 1;
            int lastIndex = numberOfEntries - 1;

            for(int index = removedIndex; index < lastIndex; index++)
            {
                list[index] = list[index + 1];
            }

        }//end of removeGap

    }//end of class

2 个答案:

答案 0 :(得分:1)

也许这会有所帮助:
我看到有两种可能的情况:

案例1:
押韵列表的大小大于或等于人名列表的大小 操作 - 删除人员列表中的最后一个元素。

案例2:
人名单的大小大于押韵列表 操作 - 删除人员列表中位于以下位置的元素:
string videoPath = $"android.resource://com.myapp.com/{Resource.Raw.video}"; videoView.SetVideoPath(videoPath);

以下是该应用程序的代码示例:

index = (person.size() % rhyme.size()) - 1

输出:

public static void main(String[] args){

    //build lists and populate. Make sure that there are more
    //players than rhymes so we can hit both cases.
    ArrayList<Integer> player = new ArrayList<>();
    ArrayList<Integer> rhyme  = new ArrayList<>();
    for(int i = 0; i < 10; i++){
        if(i < 6){
            rhyme.add(i);
        }
        player.add(i);
    }

    //play the game until we find a winner
    while(player.size() > 1) {

        int indexToRemove;

        //case 1 followed by case 2
        if (rhyme.size() >= player.size()) {
            indexToRemove = player.size() - 1;
        } else {
            indexToRemove = (player.size() % rhyme.size()) - 1;
        }
        System.out.println(player.get(indexToRemove));
        player.remove(indexToRemove);
    }
    System.out.println(player);
}

答案 1 :(得分:0)

此处忽略了来自用户的收集输入(因为游戏无关紧要知道输入的来源)。

.HtmlAttributes(attributes)

输出:

private static void runGame(String[] rhyme, List<String> players) {
    System.out.println("Rhyme is " + Arrays.toString(rhyme));
    do {
        System.out.println("The player list is " + players);
        for (int i = 0; i < rhyme.length; i++) {
            System.out.println(players.get(i % players.size()) + ": " + rhyme[i]);
        }
        System.out.println("Removing " + players.remove((rhyme.length - 1) % players.size()));
    } while (players.size() > 1);
    System.out.println("The winner is " + players.get(0));
}