bugfix> java > 投稿

コード行を取得して配列リストに入れ、そのリストを返すこの関数を作成しました。 問題は、コードをデバッグしたときに文字列をリストに入力しようとすると、挿入されたものが-[[Ljava.lang.String;@ 1786f9d5]-これを修正するにはどうすればよいですか? 私のコードは:

   public static List<String[]> GetAll(String st){
        String[] list = st.split("bags contain | contain |bags, | bag, | bags\\.| bag\\.");//ways to split it-shouldn't be changed
            List<String[]> newlist = new ArrayList<>();
            for (int i = 1; i < list.length; ++i) {
                if (!list[i].equals("no other")) {
                    int n = Integer.parseInt(list[i].split(" | \\s")[0]);
                    for (int j = 0; j < n; ++j) {
                        newlist.add(list[i].split(" \\s[0-9],\\s "));//here is the problem I think when I try to remove the number from the string
                }
        }
        }
        if(newlist.size()>1) {
            return newlist;
        }
        return new ArrayList<>();
    }
    public static void main(String[] args) {
        HashMap<String,List<String[]>> hm = new HashMap<>();// can kinda ignore the hashmap
        String input=reader.nextLine();
        while(!input.equals("-1")){
             hm.put(GetName(input),GetAll(input));
            input=reader.nextLine();
        }
}

いくつかの例では、新しい文字列の各行、最初のいくつかの単語も無視する必要があります。

サイドノート。ここでは、「shade/name color」(「contain」の前の文字列の先頭)は関係ないため、関数全体でスキップする必要があります。つまり、返される配列リストに「shade/namecolor」は表示されません。

ここでは「鈍い藍」は関係ないので、関数全体はそれをスキップする必要があります st = "鈍いインディゴバッグには、2つの色あせた黒いバッグ、2つの色あせた赤いバッグ、4つの薄暗いブロンズバッグが含まれています。"

->関数は戻る必要があります [faded black, faded black, faded red, faded red, dim bronze, dim bronze, dim bronze, dim bronze]

ここで「淡い青」は関係ないので、関数全体はそれをスキップする必要があります st = "淡いブルーのバッグには、2つの淡いフクシアバッグ、5つのミラーブロンズバッグ、2つの色あせたフクシアバッグが含まれています。"

-関数は戻る必要があります [pale fuchsia, pale fuchsia, mirrored bronze, mirrored bronze, mirrored bronze, mirrored bronze, mirrored bronze, faded fuchsia, faded fuchsia]

ここでは「ライトライム」は関係ないので、関数全体はそれをスキップする必要があります st = "ライトライムバッグには、淡いライムのバッグが4つ、格子縞の緑色のバッグが5つ、透明なターコイズのバッグが3つ、格子縞の黄色のバッグが3つ含まれています。"

->関数は戻る必要があります [pale lime, pale lime, pale lime, pale lime, plaid green, plaid green, plaid green, plaid green, plaid green, clear turquoise, clear turquoise, clear turquoise, plaid yellow, plaid yellow, plaid yellow]

ここでは「フェードターコイズ」は関係ないので、関数全体でスキップする必要があります。つまり、返される配列リストに「フェードターコイズ」は表示されません。 st = "色あせたターコイズバッグには3つのミラーシルバーバッグが含まれています。"

->関数は戻る必要があります
[mirrored silver bags, mirrored silver bags, mirrored silver bags]

ここでは「ドラブマゼンタ」は関係ないので、関数全体はスキップする必要があります st = "ドラブマゼンタバッグには2つのクリアトマトバッグが含まれています。"

->関数は戻る必要があります
[clear tomato, clear tomato]

等々 tostring()を入れようとすると-newlist.add(list [i] .split( "\ s [0-9]、\ s")。toString());-その後、.add()はエラーになります。 listarrayが文字列型の配列である場合にこれを修正して「名前の色」を取得するにはどうすればよいですか?奇妙な配列の16進文字列ではなく文字列が表示されます

助けていただければ幸いです。質問の改善や私の説明の明確さの助けも歓迎します。ありがとう

回答 3 件
  • String#split を返します String[] 。直接印刷しようとすると、同様の出力が得られます。を使用して配列を印刷できます Arrays.toString(array) または他のいくつかの方法。以下に例を示します。

    import java.util.Arrays;
    public class Main {
        public static void main(String[] args) {
            String[] arr = { "Hello", "World" };
            System.out.println(arr);
            System.out.println(Arrays.toString(arr));
            // Another way
            System.out.println(String.join(",", arr));
        }
    }
    
    

    出力:

    [Ljava.lang.String;@3b22cdd0
    [Hello, World]
    Hello,World
    
    

    コードでは、次のようにこのprintステートメントを配置できます。

    for (int j = 0; j < n; ++j) {
        // ...
        String [] arr = list[i].split(" \\s[0-9],\\s ");
        System.out.println(Arrays.toString(arr));
        newlist.add(arr);
        // ...
    }
    
    

    ただし、デバッガーは次のように要素を表示できる必要があります。

    更新:

    この更新は、OPが次のコメントで投稿した別の要件に基づいています。

    in one example it returns- [2 dark blue] --i dont want the number 2 and the space, I want it to be [dark blue, dark blue]

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    public class Main {
        public static void main(String[] args) {
            List<String[]> list = GetAll("light red bags contain 1 bright white bag, 2 muted yellow bags.");
            list.stream().forEach(e -> System.out.println(Arrays.toString(e)));
        }
        public static List<String[]> GetAll(String st) {
            String[] list = st.split("bags contain | contain |bags, | bag, | bags\\.| bag\\.");
            List<String[]> newlist = new ArrayList<>();
            for (int i = 1; i < list.length; ++i) {
                if (!list[i].equals("no other")) {
                    int n = Integer.parseInt(list[i].split(" | \\s")[0]);
                    for (int j = 0; j < n; ++j) {
                        int index = list[i].indexOf(' ');
                        if (index != -1) {
                            newlist.add(new String[] { list[i].substring(index).trim() });
                        }
                    }
                }
            }
            if (newlist.size() > 1) {
                return newlist;
            }
            return new ArrayList<>();
        }
    }
    
    

    出力:

    [bright white]
    [muted yellow]
    [muted yellow]
    
    

  • 希望する出力については、分割するのではなく、一致させるようにしてください。

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    ....
    public static List<String> GetAll(String st){
        Pattern p = Pattern.compile("\\d+\\s\\w+\\s\\w+");
        Matcher m = p.matcher(st);
        List<String> list = new ArrayList<>();
        while(m.find()){
            String found = m.group();
            //get the number by removing everything which is not a digit
            int i = Integer.parseInt(found.replaceAll("[^\\d]+", ""));
            //add n copies of the matched string after removing the digit
            list.addAll(Collections.nCopies(i, found.replaceAll("\\d+", "").trim()));
        }
        System.out.println(list);
        return list;
    }
    
    

    同じ質問ですが、他の誰かとは異なるアプローチで、一見の価値があるかもしれません

  • 何かを文字列に変換しようとして、[Ljava.lang.String;@ 1786f9d5]のように@と16進数の束を取得しようとすると、オブジェクトを文字列に変換しようとしましたが、オブジェクトは変換しません。 toString()メソッド/関数があります。入力するものが文字列であることを確認するか、toString()メソッド/関数を使用して文字列に変換できることを確認してください。

あなたの答え