【问题标题】:Return ArrayList from ArrayList method type从 ArrayList 方法类型返回 ArrayList
【发布时间】:2014-04-23 12:49:29
【问题描述】:

我正在制作一个使用 ArrayList 作为卡片组的小卡片组程序。对我设置的限制之一是我“发”牌的方法必须是 Arraylist 类型。我遇到的问题是我不知道如何从 ArrayList 中只返回一个特定的索引值。见下文。

public ArrayList deal(int n, boolean up){
    Card card0 = new Card();
    boolean cardFace = card0.state(up);
    return al.get(0);  //<-- This doesn't work, Netbeans says that it is a string type
                            //not an ArrayList type.  The only thing it will actually
                            //allow me to return is:
    return.al;  // But this doesn't work, I don't need to return the whole list,
                // just the first element, but Netbeans calls that a String type, not
                // ArrayList

那么我怎样才能返回 List 的第一项并且仍然是正确的类型呢?其余代码无关紧要,只需要 Method 类型和 return 语句。

编辑:根据要求

package deckofcards;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Deck{
    ArrayList<String> al = new ArrayList<>();
    public void shuffle(){
        Collections.shuffle(al);
    }
    public String displayDeck(){
        String returnDeck = "";
        for(int i = 0; i < al.size(); i++){
            String printDeck = al.get(i);
            returnDeck += printDeck;
        }
        return returnDeck;
    }
    public ArrayList deal(int n, boolean up){
        Card card0 = new Card();
        boolean cardFace = card0.state(up);
        return al.get(0);
    }
    public void populate(){
        al.add(0, "Ace of Spades");
        al.add(1, "Two of Spades");
        al.add(2, "Three of Spades");
        //yadaa yadaa

【问题讨论】:

  • 请向我们展示您的al 声明。这是什么?
  • 我认为您误解了问题陈述或要求。如果您必须返回 ArrayList,那么您必须将结果 放入 ArrayList 并返回。此外,您不应该使用不合格的(即原始)泛型类型。这是一个ArrayList&lt;Someclass&gt;,它有助于了解Someclass 应该是什么。您确实没有提供足够的信息。
  • 限制从何而来?如果您(在任何情况下)总是需要只返回一个元素,那么返回类型真的不应该是ArrayList。这种情况可能暗示你误解了你的任务(家庭作业?)。
  • deal(int n, boolean up) 这个方法签名看起来你应该返回一个 n 卡片的 ArrayList。我认为你需要重新阅读你的作业。
  • 这个限制确实是导师规定的。这是我对问题的解释。本质上,我必须(在另一个类文件中)调用 deal 方法,该方法将显示列表中的 n 元素,然后删除它们。所以在测试类文件中,我执行deck0.deal(int n, boolean up),然后必须打印出n 卡片,声明它们是朝上还是朝下,然后从列表中删除这些元素。我不知道如何在测试类结束时做到这一点,所以我想我必须在方法本身中做到这一点,如上所述。

标签: java methods arraylist return


【解决方案1】:

//添加和删除员工 //显示员工列表

公共类 EployeeDB { 静态 ArrayList e = new ArrayList();

public static boolean addEmployee(Employee e1) {

    e.add(e1);
    System.out.println("Employee added");
    return true;

}

public static boolean deleteEmployee(int ecode) {
    int temp = 0;
    for (int i = 0; i < e.size(); i++) {

        if (e.get(i).getID() == ecode) {
            temp = temp + 1;
            e.remove(i);
            break;
        }
    }
    if (temp == 1)
        System.out.println("Emp deleted");
    else
        System.out.println("Deletion unsuccessful, check ecode again");
    return true;

}

public static String showPaySlip(int ecode) {
    double salary = 0;
    int temp = 0;
    for (int i = 0; i < e.size(); i++) {
        if (e.get(i).getID() == ecode) {
            temp = temp + 1;
            salary = e.get(i).getSalary();
            break;
        }
    }
    if (temp == 1)
        return "Salary is" + salary;
    else
        return "No employye found with the specified ecode";

}

public static ArrayList<Employee> listAll() {

    return e;

}

public static void main(String[] args) {
    Employee e1 = new Employee();
    e1.setID(20);
    e1.setName("sai");
    e1.setSalary(150.00);
    addEmployee(e1);
    Employee e2 = new Employee();
    e2.setID(30);
    e2.setName("kumar");
    e2.setSalary(1500.00);
    addEmployee(e2);
    deleteEmployee(30);
    System.out.println(showPaySlip(30));

    for (int i = 0; i < e.size(); i++)
        System.out.println(
                listAll().get(i).getID() + " " + listAll().get(i).getName() + " " + listAll().get(i).getSalary());

}

}

【讨论】:

    【解决方案2】:

    如果您无法更改签名并且必须返回一个数组列表,那么您可以创建一个只有一个元素的数组列表并将其返回。像这样的:

    ArrayList returnList = new ArrayList();
    returnList.add(al.get(0));
    return returnList;
    

    我觉得不太好:-(

    【讨论】:

    • @JasonC 是的,Jason 我在输入后才意识到...无论如何谢谢...已更正!
    • 这可能是也可能不是 OP 需要的。由于问题非常不清楚,您应该发表评论要求澄清,或者等到问题有意义。
    【解决方案3】:

    是否有理由必须返回 ArrayList?本质上,您正在尝试创建一个方法,该方法获取一副牌,挑选一张牌,然后返回一副牌。您可以尝试使用上面提到的 subList 方法。您可以创建一个只包含您想要的卡片的新 ArrayList,但这不是很有效。或者,如果您的目标是实际返回整个牌组,但在顶部有正确的卡片(也就是在 ArrayList 的第一个位置),那么网上有很多关于在 ArrayList 中重新排列值的信息。

    编辑:根据您的完整代码,目标似乎是将第一张卡面朝上翻转。你应该这样做(不会为你做功课!)然后返回该方法接收的 ArrayList。IRL,想象给某人一副牌,他们将第一张牌翻面朝上,然后把牌还给你。

    【讨论】:

      【解决方案4】:

      在您的具体情况下,alArrayList&lt;String&gt;。这意味着al.get(...) 返回一个String。但是,您的方法被声明为返回 ArrayList,而不是 String。您需要将您的方法返回类型更改为String,或者您需要构造一个新的ArrayList 并将您的单个字符串添加到其中并返回它。

      您声明的返回类型需要与您要返回的对象相匹配。比如:

       ArrayList<String> al = ...;
      
       String getSingleItem (int index) {
           return al.get(index);
       }
      
       ArrayList<String> getSingleItemAsArrayList (int index) {
           ArrayList<String> single = new ArrayList<String>();
           single.add(al.get(index));
           return single;
       }
      
       ArrayList<String> getItems () {
           return al;
       }
      

      顺便说一句,通常最好将类型参数指定为ArrayList,例如ArrayList&lt;Whatever&gt;,因为这可以为您节省很多围绕/未经检查的转换的东西,并且可以在编译时检查类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-19
        • 2020-05-07
        • 2015-01-29
        • 2013-07-02
        • 2012-05-27
        • 1970-01-01
        • 2014-11-17
        相关资源
        最近更新 更多