【问题标题】:I get a compile time error when accessing an ArrayList with a new method使用新方法访问 ArrayList 时出现编译时错误
【发布时间】:2014-10-17 21:34:45
【问题描述】:

我正在尝试访问在同一类中以不同方法创建的ArrayList。扫描仪方法从文本文件中提取数据。文本文件数据是这样出现的:123 12 1 43,有换行符...

目前,我的方法可以提取数据,但在该方法结束后无法编译。我最初将整个代码放在同一个方法中,并且效果很好。但是我想通过在这个类中创建一个新方法来返回最大值,然后创建一个tester 类来访问这个新方法。这是我现有的代码。或者如果有更好的解决方案。我全神贯注。

public class DataAnalyzer {

public DataAnalyzer(File data) throws FileNotFoundException
{

        List<Integer> rawFileData = new ArrayList<>();
        FileReader file = new FileReader("info.txt");
        try (Scanner in = new Scanner(file)) {
            while(in.hasNext())
            {
                rawFileData.add(in.nextInt());
            }
        }
}

public int getLargest(rawFileData){
     int largest = rawFileData.get(0);
        for (int i = 1; i < rawFileData.size(); i++){
            if (rawFileData.get(i) > largest)
            {
                largest = rawFileData.get(i);
            }
        }

        for (Integer element : rawFileData){
            if (element == largest)
            {
                System.out.print("This is the Largest Value: ");
                System.out.print(element);
            }
        }

    }      
}

【问题讨论】:

  • public int getLargest(rawFileData) ? Type 在哪里?
  • Collections.max 有什么问题吗?您需要阅读一些关于如何定义方法的基本 Java 教程——您的构造函数具有输入变量的类型参数;您的方法的类型参数在哪里?
  • 我对 Java 还很陌生,正在学习更多关于对象和编写访问方法的知识。所以我不确定我是否没有关注你的一些 cmets。
  • 样式说明:您从getLargest() 内部调用rawFileData.get(i)。只有当 rawFileData 引用 ArrayList 时,您才会这样做。好的,在这个例子中它确实引用了一个ArrayList,但如果代码依赖 rawFileData引用一个ArrayList,那么它应该声明 作为 ArrayList,而不仅仅是 List。这在一个大型的、不断发展的程序中很重要,其中一些其他程序员可能会更改构造函数以创建其他类型的 List,而没有意识到 List 的类型很重要。
  • 我收到一个编译时错误是你所能提供的最无用的信息。唯一没有帮助的是我收到一个错误。此外,您发布了一个问题并得到了回答。完全改变问题并希望得到新的答案不仅是徒劳的,而且会使所有已经给出的答案无效——从而使问题对未来的读者毫无用处。我已经回复了你的问题。如果您想问另一个问题,问另一个问题

标签: java class object methods arraylist


【解决方案1】:

您的主要问题在于您的方法声明。它需要一个类型参数:

public int getLargest(List<Integer> rawFileData)

注意List&lt;Integer&gt;

现在,Collections 实用程序类中已经有一个方法。您最好详细查看该链接 - 那里有许多有用的方法。从具有自然顺序的Objects 中的Collection 中获取最高元素(例如Integer)。例如

int largest = Collections.max(rawFileData)

所以你的方法可以简化为:

public int getLargest(List<Integer> rawFileData)
    return Collections.max(rawFileData);
}

在开始编写代码之前,你需要更仔细地考虑你的逻辑,例如,你的第一个循环是好的:

    int largest = rawFileData.get(0);
    for (int i = 1; i < rawFileData.size(); i++){
        if (rawFileData.get(i) > largest)
        {
            largest = rawFileData.get(i);
        }
    }

你做的正是任何程序员都会做的。但是,当您找到 largest 时,由于某种原因,您再次循环,而不是返回它:

    for (Integer element : rawFileData){
        if (element == largest)
        {
            System.out.print("This is the Largest Value: ");
            System.out.print(element);
        }
    }

问问自己这是做什么的?你有一个List,比如苹果。您查看每个并比较它们 - 找到最大的苹果。您现在拥有List 中最大的苹果。然后,您再次遍历List,寻找与您已经找到的苹果相匹配的苹果。为什么要这样做?

此外,您永远不会从方法中return。您的方法被声明为返回 int;但你永远不会这样做。

【讨论】:

  • 谢谢,我已经开始阅读您分享的 java 文档链接了。
  • 所以我可以使用这个方法在同一个类中创建一个getMethod。然后创建一个单独的类来拉取该 getMethod 并获取 Collections.max(rawFileData) 数据?
  • 我不明白这个问题。
  • 这就是我想要做的。 public class DataAnalyzerTester { /** * @param args 命令行参数 */ public static void main(String[] args) { System.out.println("输入你的文件名:"); } 公共无效 printLargest(DataAnalyzer rawFileData) { rawFileData.getLargest(); System.out.println(rawFileData.getLargest()); } }
  • 我不相信评论中的一些未格式化和难以辨认的代码可以很好地阐明这个问题。如果您还有其他问题,请发布另一个问题 - 我认为此问题已结束。
【解决方案2】:

您的方法定义中缺少的类型是这里的问题。

更改方法定义
public int getLargest(rawFileData) {
    ....
}

public void getLargest(List<Integer> rawFileData) {
    ....
}

并且方法中的第二个 for 循环是不必要的。最大整数已经存储在变量“最大”中,您可以在第一个 for 循环之后打印它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多