【问题标题】:Array's elements' attributes in javajava中数组元素的属性
【发布时间】:2018-03-29 12:18:52
【问题描述】:

我是 Java 新手。我有一个数组,其中包含 int 类型的运动 ID。这些 ID 包含运动名称和卡路里,如果您进行 1 小时的运动会燃烧。我想通过这个数组的元素添加这些属性(名称和卡路里)。我还在阅读一个包含运动 ID、名称和卡路里信息的文件。我将它们拆分为\t。它正在分裂,但问题是,我的实现没有分配属性。我需要在Sports class 而不是Main class 上执行此操作。而且我必须在其他类中访问这个数组及其属性。如果我在打电话给array[2].name 时举个例子,这一定会给我Basketball 这样的例子。或者,array[2].calorie 必须给我200。我已经尝试过 for 循环并将它们分配为:

for ( int i = 0; i < array.length; i++ ) {
    array[i].name = nameOfSport;
    array[i].calorie = calorieOfSport;
}




   import java.io.*;
import java.util.*;

public class Sport {
    private int sportID;
    private String sportName;
    private int sportCalorie;
    public int[] sportArray = new int[0];

    public void readFileSport() {


        File file = new File("src/sport.txt");

        try {
            BufferedReader br = new BufferedReader(new FileReader(file));
            int i = 0;
            String str;

            try {
                while ((str = br.readLine()) != null) {
                    int j = 0;

                    for ( String retval: str.split("\t")) {
                        if ( j == 0 ) {
                            System.out.println(retval);
                            sportArray = addElementArray(sportArray, Integer.parseInt(retval));
                            System.out.println(sportArray[i]);
                            j++;
                        } else {

                            if (j == 1) {
                               // System.out.println(retval);
                                setSportName(sportArray, retval, i);
                                System.out.println(sportArray[i].sportName);
                                j++;
                            } else if (j == 2) {
                                //System.out.println(retval);
                                setSportCalorie(Integer.parseInt(retval));
                                j++;
                            }
                        }
                    }
                    i++;
                }
            } catch (FileNotFoundException e) {
                System.out.println("Sport File could not find");
            }


        } catch (IOException e) {
            System.out.println("Sport file could not read!");
        }
    }

    public void assignFields () {

    }

    public void setSportID (int sportID) {
        this.sportID = sportID;
    }

    public void setSportName (int[] array, String name, int e) {
        array[e].sportName = name;
    }

    public void setSportCalorie (int sportCalorie) {
        this.sportCalorie = sportCalorie;
    }
    public void print() {
        int k = 0;
        while ( k < sportArray.length ) {
            System.out.println(sportID);
            k++;
        }
    }
    public static int[] addElementArray(int[] array, int newInt) {
        int[] newArray = new int[array.length + 1];

        for ( int i = 0 ; i < array.length ; i++ ) {
            newArray[i] = array[i];
        }

        newArray[newArray.length - 1] = newInt;

        return newArray;
    }

    public int[] getSportArray() {
        return sportArray;
    }

}

【问题讨论】:

  • 目前/预期的行为是什么?
  • 您应该添加array的确切类型,并添加相应的类以便我们能够提供帮助
  • 您缺少解析文件的代码部分和初始化数组的部分。
  • @Mena 解析文件的部分无关,只是硬编码解析的文件。 (minimal reproducible example)
  • @OHGODSPIDERS 我已编辑

标签: java arrays loops


【解决方案1】:

假设您有一个名为Sports 的类,其中

public class Sport{
    public String name;
    public int calorie;
}

然后你启动它们

Sport[] sports = new Sport[]  // or your own split() to specify length
Arrays.setAll(sports, i->new Sport())

这应该可以解决问题。 您也可以使用ArrayList,在其中您可以在遍历行的同时添加新元素。

public static void readFileSport() {
    File file = new File("src/sport.txt");
    try {
        Scanner br = new Scanner(file);
        int i = 0;
        String str;

        try {
            while (br.hasNextLine()) {
                String[] info=str.split("\t");
                System.out.println(info[0]);
                sportArray = addElementArray(sportArray, Integer.parseInt(info[0]));
                System.out.println(sportArray[i]);

                // System.out.println(info[1]);
                setSportName(sportArray, info[1], i);
                System.out.println(sportArray[i].sportName);

                //System.out.println(info[2]);
                setSportCalorie(Integer.parseInt(info[2]));
                i++;
            }
        } catch (FileNotFoundException e) {
            System.out.println("Sport File could not find");
        }


    } catch (IOException e) {
        System.out.println("Sport file could not read!");
    }
}

当每行只有 3 个对象时,这种方式实际上更容易。

【讨论】:

  • 但数组必须包含 int 类型的 ID。名称和卡路里必须是数组这些元素的属性
  • Arrays.fill(s, new Sports()); 将用Sports 类的single/same 实例填充数组。因此,将通过所有索引看到该实例中的更改。也许你的意思是Arrays.setAll(s, i-&gt;new Sport())
  • @fokclac 如果您正在寻找将int 映射到Sport,那么您可能想要使用Map&lt;Integer, Sport&gt; 而不是数组。
  • @Pshemo 地图无法使用 :(
  • @fokclac 有什么特别的原因吗?也许在您的问题中澄清它,因为目前尚不清楚您要实现什么(至少是 IMO)以及您面临什么问题。
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
相关资源
最近更新 更多