Как я могу вернуть int и строковые атрибуты в одном методе Java? - PullRequest
0 голосов
/ 12 апреля 2019

Я хотел бы вернуть значения всех атрибутов из класса BaseballPlayer.Метод, который должен сделать это, должен быть методом public string getBaseballPlayer(int i) (потому что мне нужно ссылаться на этот метод внутри getBaseballPlayers(), чтобы вернуть все значения как массив строк). У меня возникают проблемы с этим, потому что все атрибутыимеют разные типы данных (int, String, Height).

Я пытался сделать это:

public String getBaseballPlayer(int i){

ArrayList <String> bArray = new ArrayList <String>();  
    bArray.add(getHometown());
    bArray.add(getState());                       
    bArray.add(getHighSchool());
    bArray.add(getPosition());

Однако, это работает только для строковых методов и не обязательно возвращает фактические значения, а скорее методы get для каждого строкового атрибута..

public class BaseballPlayer extends Player implements Table {    

  private int num;
  private String pos;

public BaseballPlayer( int a, String b, String c, int d, 
String e, String f, String g, Height h){


        super(a,ft,in,c,d,e,f,ht);
        num = a;
        pos = b; 

}

public BaseballPlayer(){}


//Returns the value of a specific attribute. The input parameter start 
  with 0 for the first attribute, then 1 for the second attribute and so 
  on.
//you can use getBaseballPlayer(int i) in getBaseballPlayers( ) with a for 
  loop getting each getBaseballPlayer(int i).


public String getBaseballPlayer(int i){

ArrayList <String> bArray = new ArrayList <String>();  
    bArray.add(getHometown());
    bArray.add(getState());                       
    bArray.add(getHighSchool());
    bArray.add(getPosition());
    return (bArray);    
}

//Returns the value of all attributes as an ArrayList of Strings.
public ArrayList <String> getBaseballPlayers(){
}

Я просто ищу самый простой способ вернуть каждое значение атрибута, а затем с помощью этого метода вернуть каждое значение как массив строк в другом методе.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

То, что вы хотите сделать, если вы хотите сделать это идеально, это то, для чего Gson .Он работает поверх простого JSON и может кодировать произвольные классы, структуры данных и другие типы в JSON, так что вы можете легко восстановить эти объекты из представления JSON.Его легко использовать, учитывая, насколько мощным он действительно является.

Еще проще использовать обычный JSON, если вам не нужно кодировать типы, которые JSON не будет обрабатывать сам по себе.В вашем случае кажется, что это может быть достаточно хорошо.Отличительной особенностью JSON является то, что это стандарт.Вам не нужно выбирать схему кодирования, и у вас уже есть библиотеки, написанные на любом языке, который вы можете себе представить, который может читать ваши String'ified данные.

Вот пример, который примерно соответствует тому, что делает ваш код:

import org.codehaus.jackson.map.ObjectMapper;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.List;

public class BaseballPlayer {

    private String name;
    private String hometown;
    private String state;
    private int age;
    private double height;
    private String position;

    static ObjectMapper mapper = new ObjectMapper();

    public BaseballPlayer( String name, String hometown, String state, int age, double height, String position) {
        this.name = name;
        this.hometown = hometown;
        this.state = state;
        this.age = age;
        this.height = height;
        this.position = position;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setHometown(String hometown) {
        this.hometown = hometown;
    }

    public void setState(String state) {
        this.state = state;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setHeight(float height) {
        this.height = height;
    }

    public void setPosition(String position) {
        this.position = position;
    }

    public String toString() {
        return String.format("Name: %s from %s, %s (height: %.1f)", name, hometown, state, height);
    }

    public BaseballPlayer(){}

    // Turn a BaseballPlayer object into a String
    public String getAsJSON() {
        Map<String, Object> info = new HashMap<>();
        info.put("name", name);
        info.put("hometown", hometown);
        info.put("state", state);
        info.put("age", age);
        info.put("height", height);
        info.put("position", position);

        try {
            return mapper.writeValueAsString(info);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    // Here's the method you ask for.  I don't know what 'i' is supposed
    // to do, since we're in the class for a single baseball player.  You
    // could create a class that contains a list of baseball players, but
    // why not just use a List by itself, as I've done.
    public String getBaseballPlayer(int i) {
        return getAsJSON();
    }

    // Turn a list of BaseballPlayer objects into a list of Strings
    public static List<String> playersToStrings(List<BaseballPlayer> players) {
        List<String> r = new ArrayList<>();
        for (BaseballPlayer player : players) {
            r.add(player.getAsJSON());
        }
        return r;
    }

    // Turn a list of Strings into a list of BaseballPlayer objects
    public static List<BaseballPlayer> stringsToPlayers(List<String> playerStrings) {
        List<BaseballPlayer> r = new ArrayList<>();
        for (String playerString : playerStrings) {
            try {
                BaseballPlayer player = mapper.readValue(playerString, BaseballPlayer.class);
                r.add(player);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return r;
    }

    public static void main(String... args) {

        // Create a list of BaseballPlayer objects and print them
        List<BaseballPlayer> players = new ArrayList<>();
        players.add(new BaseballPlayer("Joe", "Boston", "MA", 25, 6.1, "First Base"));
        players.add(new BaseballPlayer("Sam", "San Francisco", "CA", 28, 5.8, "Pitcher"));
        players.add(new BaseballPlayer("Kelly", "Chicago", "IL", 32, 6.4, "Catcher"));
        System.out.println(players);

        // Convert the list to a list of Strings and print the list
        List<String> playerStrings = playersToStrings(players);
        System.out.println(playerStrings);

        // Convert the Strings back into BaseballPlayer objects and print them
        players = stringsToPlayers(playerStrings);
        System.out.println(players);
    }

}

и вот результат:

[Name: Joe from Boston, MA (height: 6.1), Name: Sam from San Francisco, CA (height: 5.8), Name: Kelly from Chicago, IL (height: 6.4)]
[{"hometown":"Boston","name":"Joe","state":"MA","position":"First Base","age":25,"height":6.1}, {"hometown":"San Francisco","name":"Sam","state":"CA","position":"Pitcher","age":28,"height":5.8}, {"hometown":"Chicago","name":"Kelly","state":"IL","position":"Catcher","age":32,"height":6.4}]
[Name: Joe from Boston, MA (height: 6.1), Name: Sam from San Francisco, CA (height: 5.8), Name: Kelly from Chicago, IL (height: 6.4)]

Здесь каждый игрок превращается в JSONиндивидуально.Еще несколько строк кода, и вы можете превратить массив объектов Baseball Player в одну строку.

Если это решение только для JSON недостаточно для вас, посмотрите Gson.Это может сохранить все типы Java.Требуется чуть больше настроек, чтобы описать, как каждый из ваших объектов должен быть превращен в JSON и обратно.

0 голосов
/ 12 апреля 2019

Не рекомендуется возвращать весь объект как одну строку.Если иное не заставит вас делать это, не пытайтесь делать.

Что ж, если ваше требование не может быть изменено, и если вы хотите, чтобы все из объекта Baseball было в одной строке, вы можете объединить все параметры с разделителем, таким как ":".

Например:

public String getBaseballPlayer(int i){
    return getHometown() + ":" + getState() + ":" +getHighSchool() + ":" + getPosition();
}

На вызывающей стороне вы можете получить отдельные значения из этой строки, используя метод String "split ()".

...