Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java打印数组列表中出现的元素_Java_Arraylist - Fatal编程技术网

使用java打印数组列表中出现的元素

使用java打印数组列表中出现的元素,java,arraylist,Java,Arraylist,嗨,我已经创建了一个逻辑来计算数组列表中元素的出现次数,但是它没有按照我想要的顺序打印。下面我提供了我的代码和我的要求 我需要在下面的格式 list: [1, 1, 5, 3, 7 ,7 ,7 , 3, 11, 2, 2, 3, 1] number: 1, count: 2 number: 5, count: 1 number: 3, count: 1 number: 7, count: 3 number: 3, count: 1 number: 11, count: 1 number: 2,

嗨,我已经创建了一个逻辑来计算数组列表中元素的出现次数,但是它没有按照我想要的顺序打印。下面我提供了我的代码和我的要求

我需要在下面的格式

list: [1, 1, 5, 3, 7 ,7 ,7 , 3, 11, 2, 2, 3, 1]
number: 1, count: 2
number: 5, count: 1
number: 3, count: 1
number: 7, count: 3
number: 3, count: 1
number: 11, count: 1
number: 2, count: 2
number: 3, count: 1
number: 1, count: 1
list: [1, 1, 5, 3, 7 ,7 ,7 , 3, 11, 2, 2, 3, 1]
number: 1, count: 3
number: 5, count: 1
number: 3, count: 3
number: 7, count: 3
number: 11, count: 1
number: 2, count: 2
但是,我得到以下格式

list: [1, 1, 5, 3, 7 ,7 ,7 , 3, 11, 2, 2, 3, 1]
number: 1, count: 2
number: 5, count: 1
number: 3, count: 1
number: 7, count: 3
number: 3, count: 1
number: 11, count: 1
number: 2, count: 2
number: 3, count: 1
number: 1, count: 1
list: [1, 1, 5, 3, 7 ,7 ,7 , 3, 11, 2, 2, 3, 1]
number: 1, count: 3
number: 5, count: 1
number: 3, count: 3
number: 7, count: 3
number: 11, count: 1
number: 2, count: 2
这是我的密码

package com.abc;

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

public class MyArrayListSort
{
public static void main(String []args){
new MyArrayListSort().start();
}
public void start() {
    List<Integer> list = getList(1, 1, 5, 3, 7 ,7 ,7 , 3, 11, 2, 2, 3, 1);

    Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>();
    for (Integer i : list) {
        Integer retrievedValue = map.get(i);
        if (null == retrievedValue) {
            map.put(i, 1);
        }
        else {
            map.put(i, retrievedValue + 1);
        }
    }

    System.out.println("list: " + list);
    printCount(map);
}

private List<Integer> getList(int... numbers)
{
List<Integer> list = new ArrayList<Integer>();
for (int i : numbers)
{
    list.add(i);
}
return list;
}

private void printCount(Map<Integer, Integer> map)
{
for (Integer key : map.keySet())
{
    System.out.println("number: " + key + ", count: " + map.get(key));
}
}
}
package com.abc;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
公共类MyArrayListSort
{
公共静态void main(字符串[]args){
新建MyArrayListSort().start();
}
公开作废开始(){
List=getList(1,1,5,3,7,7,7,3,11,2,2,3,1);
Map Map=newlinkedhashmap();
for(整数i:列表){
整数retrievedValue=map.get(i);
if(null==retrievedValue){
图.put(i,1);
}
否则{
map.put(i,retrievedValue+1);
}
}
System.out.println(“列表:+list”);
打印计数(map);
}
私有列表getList(整数…数字)
{
列表=新的ArrayList();
用于(int i:数字)
{
列表.添加(i);
}
退货清单;
}
私有void打印计数(映射)
{
for(整数键:map.keySet())
{
System.out.println(“编号:+key+”,计数:+map.get(key));
}
}
}
逻辑: 跟踪currentValue及其在连续序列中重复的次数。一旦数字发生变化,请在列表中插入到目前为止的值和计数。
最后是剩余值(列表中的最终值),按下该值并进行计数

编辑: 正如@Andreas在评论中指出的那样,您可以完全删除newList并编写print语句

代码:

List<Integer> list = Arrays.asList(1, 1, 5, 3, 7, 7, 7, 3, 11, 2, 2, 3, 1);

List<Pair<Integer, Integer>> newList = new ArrayList<>();

Integer previousValue = null;
Integer previousCount = 0;
for(Integer value : list) {
    if(previousValue == null) {
        previousValue = value;
        previousCount++;
    } else if(previousValue.intValue() == value.intValue()) {
        previousCount++;
    } else {
        newList.add(new Pair<>(previousValue, previousCount));
        previousValue = value;
        previousCount = 1;
    }
}
if(previousValue != null) {
    newList.add(new Pair<>(previousValue, previousCount));
}

for(Pair<Integer,Integer> pair : newList) {
    System.out.println(pair.getKey()  + ":" + pair.getValue());
}
1:2
5:1
3:1
7:3
3:1
11:1
2:2
3:1
1:1
逻辑: 跟踪currentValue及其在连续序列中重复的次数。一旦数字发生变化,请在列表中插入到目前为止的值和计数。
最后是剩余值(列表中的最终值),按下该值并进行计数

编辑: 正如@Andreas在评论中指出的那样,您可以完全删除newList并编写print语句

代码:

List<Integer> list = Arrays.asList(1, 1, 5, 3, 7, 7, 7, 3, 11, 2, 2, 3, 1);

List<Pair<Integer, Integer>> newList = new ArrayList<>();

Integer previousValue = null;
Integer previousCount = 0;
for(Integer value : list) {
    if(previousValue == null) {
        previousValue = value;
        previousCount++;
    } else if(previousValue.intValue() == value.intValue()) {
        previousCount++;
    } else {
        newList.add(new Pair<>(previousValue, previousCount));
        previousValue = value;
        previousCount = 1;
    }
}
if(previousValue != null) {
    newList.add(new Pair<>(previousValue, previousCount));
}

for(Pair<Integer,Integer> pair : newList) {
    System.out.println(pair.getKey()  + ":" + pair.getValue());
}
1:2
5:1
3:1
7:3
3:1
11:1
2:2
3:1
1:1

下面可能是解决此问题的最短代码版本:

List<Integer> list = Arrays.asList(1, 1, 5, 3, 7, 7, 7, 3, 11, 2, 2, 3, 1);
System.out.println("list: " + list);
for (int i = 0, prev = -1; i < list.size(); i++) {
    if (i == list.size() - 1 || ! list.get(i).equals(list.get(i + 1))) {
        System.out.printf("number: %d, count: %d%n", list.get(i), i - prev);
        prev = i;
    }
}

下面可能是解决此问题的最短代码版本:

List<Integer> list = Arrays.asList(1, 1, 5, 3, 7, 7, 7, 3, 11, 2, 2, 3, 1);
System.out.println("list: " + list);
for (int i = 0, prev = -1; i < list.size(); i++) {
    if (i == list.size() - 1 || ! list.get(i).equals(list.get(i + 1))) {
        System.out.printf("number: %d, count: %d%n", list.get(i), i - prev);
        prev = i;
    }
}

这是另一个问题@Tim BiegeleisenIf如果你看得真的很近,你可能会看到过去的错觉,并意识到列表中有三个1,两个在开头,一个在结尾。您的代码执行的正是您要求它执行的操作,即计算每个值的出现次数。--提示:您不能对“所需”结果使用
Map
,因为根据定义
Map
不能有重复的键,因此不可能使用
Map
为值1创建两个结果行。您需要类似于链接列表的内容。正如@Andreas指出的,地图在这里不起作用。是的,我知道了。你能帮我制定逻辑或给任何文章提供一些链接,让我了解一些想法吗?这是一个不同的问题@Tim BiegeleisenIf如果你看得真的,真的很近,你可能能够看到过去的幻觉,并意识到列表中有三个1,开头两个,结尾一个。您的代码执行的正是您要求它执行的操作,即计算每个值的出现次数。--提示:您不能对“所需”结果使用
Map
,因为根据定义
Map
不能有重复的键,因此不可能使用
Map
为值1创建两个结果行。您需要类似于链接列表的内容。正如@Andreas所指出的,地图在这里不起作用。是的,我知道了。你能帮我制定逻辑或给任何文章提供一些链接,以便我了解一些想法吗……我没有否决这一点,但你的输出没有显示输入数据中的最终
1
。否决者,请评论错误,以便更正答案。问题和代码的预期输出是相同的。我是下一个投票人,因为:1)您缺少
number:1,count:1
的最后一个结果。2) 为什么要建立一个列表?直接打印结果即可。那么就不需要配对了。3)
previousValue==value
不是比较两个
Integer
对象的正确方法。@Andreas更正了1和1的代码。我想到了,但忘了写那封信。还添加了intValue转换。此外,新列表已创建,以便他可以使用它。没错,我们也可以直接打印。但我想这取决于提问者如何使用他喜欢的方式。我没有否决这一点,但您的输出没有显示输入数据中的最终
1
。否决者,请评论错误,以便更正答案。问题和代码的预期输出是相同的。我是下一个投票人,因为:1)您缺少
number:1,count:1
的最后一个结果。2) 为什么要建立一个列表?直接打印结果即可。那么就不需要配对了。3)
previousValue==value
不是比较两个
Integer
对象的正确方法。@Andreas更正了1和1的代码。我想到了,但忘了写那封信。还添加了intValue转换。此外,新列表已创建,以便他可以使用它。没错,我们也可以直接打印。但我想这取决于提问者如何使用他喜欢的方式。