java,以某种方式更改-[[ljava.lang.string@1786f9d5]到函数中的常规字符串?

kq0g1dla  于 2021-07-03  发布在  Java
关注(0)|答案(4)|浏览(339)

这个问题在这里已经有答案了

打印java数组最简单的方法是什么(32个答案)
上个月关门了。
我构建了这个函数,它接受一行代码并将其放入arraylist并返回该列表。问题是当我试着将字符串输入到列表中时,当我调试代码时,它告诉我插入的是-[[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();
        }
}
    public static String GetName(String st){
        return st.split("bags")[0].stripTrailing();

    }
    static boolean isInArr(String[] arr,String looking){
        for (String s:arr){
            if(s.strip().equals(looking.strip())){
                return true;
            }
        }
        return false;
    }

例如,每一行中的一个新字符串,前几个单词也应忽略:
旁注。这里“shade/name color”(在“contain”之前的字符串的开头)是不相关的,因此函数整体应该跳过它-这意味着在返回“shade/name color”的arraylist中不会出现
此处“暗靛蓝”不相关,因此功能整体应跳过它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] 此处“褪色的绿松石色”不相关,因此函数整体应跳过它-这意味着在返回“褪色的绿松石色”的arraylist中不会出现st=“褪色的绿松石色袋子包含3个镜像的银色袋子。”
-->函数应该返回 [mirrored silver bags, mirrored silver bags, mirrored silver bags] 这里“drab-magenta”是不相关的,所以函数整体应该跳过st=“drab-magenta包包含2个透明番茄包。”
-->函数应该返回 [clear tomato, clear tomato] 以此类推,当我尝试放置tostring()-newlist.add(list[i].split(“\s[0-9],\s”).tostring())--那么.add()就是一个错误。当listarray是string类型的array并得到“name color”时,我如何修复这个问题?它给我的是字符串而不是奇怪的数组十六进制字符串
如果您能帮助我,我们将不胜感激,同时也欢迎您帮助我改进问题或澄清我的解释。谢谢

wlsrxk51

wlsrxk511#

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在以下评论中发布的另一项要求:
在一个例子中,它返回-[2深蓝]--我不想要数字2和空格,我想要它是[深蓝,深蓝]

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]
6yt4nkrj

6yt4nkrj2#

我不会给你整个实现,但我没有在那台机器上:)我想指出的是,你在正确的轨道上。不幸的是,您的解决方案太复杂了!与其多次返回包含相同字符串的数组,不如返回 Map<String, Integer> . 这里有一些类似于我今天早些时候使用的代码。

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

    Map<String,Map<String,Integer>> inputMap = parseInputString(input);

    System.out.println(inputMap);
}

private static Map<String,Map<String,Integer>> parseInputString(String input) {

    String keyDelimiter = " bags contain ";
    String valuesDelimiter = " (bag|bags)(\\.|,\\s)";
    String noValuesEnding = "no other bags.";

    return Arrays.stream(input.split("\n"))
                 .filter(line -> !line.endsWith(noValuesEnding))
                 .map(line -> line.split(keyDelimiter))
                 .collect(Collectors.toMap(
                     line -> line[0],
                     line -> Arrays.stream(line[1].split(valuesDelimiter))
                                   .collect(Collectors.toMap(
                                       value -> value.substring(value.indexOf(" ") + 1),
                                       value -> Integer.parseInt(value.substring(0, value.indexOf(" ")))))));
}
pbwdgjma

pbwdgjma3#

当您尝试将某个内容转换为字符串并获得类似于[ljava.lang.string@1786f9d5]使用@和一堆十六进制数字,这意味着您试图将对象转换为字符串,而该对象没有tostring()方法/函数。确保输入的是字符串,或者可以使用tostring()方法/函数转换为字符串。

svdrlsy4

svdrlsy44#

对于所需的输出,应尝试匹配而不是拆分:

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;
}

同样的问题,但不同于其他人的方法,可能值得一看

相关问题