多维数组操作-Java

多维数组操作-Java,java,arrays,data-structures,Java,Arrays,Data Structures,我有一系列的数组,我从中提取数据,最终得到一个最终的数组,它保存了我想要的信息。最后一个数组是二维的,由大量的一维数组组成,每个数组最多容纳3个条目 int[][] realOcc = new int[result.length][3]; 数组保存数据的方式如下:第一个“单元格”保存一个名称,第二个保存一个区域ID,第三个保存一个发生编号——一个int,告诉我这个名称在这个特定区域ID中出现了多少次 在使用冒泡排序算法根据名称对数组进行排序后,我自然会看到许多我不想出现的条目。例如,假设一个名

我有一系列的数组,我从中提取数据,最终得到一个最终的数组,它保存了我想要的信息。最后一个数组是二维的,由大量的一维数组组成,每个数组最多容纳3个条目

int[][] realOcc = new int[result.length][3];
数组保存数据的方式如下:第一个“单元格”保存一个名称,第二个保存一个区域ID,第三个保存一个发生编号——一个int,告诉我这个名称在这个特定区域ID中出现了多少次

在使用冒泡排序算法根据名称对数组进行排序后,我自然会看到许多我不想出现的条目。例如,假设一个名称在一个特定的区域ID中出现3次。该名称的数组条目如下所示:

Name1 regionID17 1
Name1 regionID17 2
Name1 regionID17 3
...
Name156 regionID1 1
Name168 regionID99 1
...
我想做的是去掉所有多余的条目,如中所示,对应于相同名称和regID的条目,只保留特定区域中每个名称的最大出现次数。因此,以上面的示例为例,我希望在操纵数组后看到:

Name1 regionID17 3
...
Name156 regionID1 1
Name168 regionID99 1
...

任何想法都将不胜感激,因为我几乎被难倒了。。请记住,由于我提取的数据数量相当大,我还需要保持代码的效率。

您真正应该研究的是使用
ArrayList
类来保存这些“项”

您还应该创建一个特定的类来保存此数据

您的自定义类应该如下所示:

class Entry implements Comparable<Entry> {
    private String name, region;
    private int occuranceCount;

    public Entry(String nameP, regionP, occurCountP){
        name = nameP;
        region = regionP;
        occuranceCount = occurCountP;
    }

    // Getters

    public int compareTo(Entry other){
        return name.compareTo(other.name);
    }

    // Equals and hashcode
}
类条目实现了可比较的{
私有字符串名称,区域;
私人帐户;
公共条目(字符串nameP、regionP、occurCountP){
name=nameP;
region=regionP;
发生次数=发生次数;
}
//吸气剂
公共整数比较(其他条目){
返回name.compareTo(其他.name);
}
//Equals和hashcode
}
然后,您可以将这些对象放入
ArrayList
中,并使用
Collections.sort()
,这将比冒泡排序快得多


排序后,您可以使用
ArrayList.remove()

循环并删除重复的条目。我想到一个问题:为什么要使用数组?我认为最好使用一个Set对象来保存结果,然后创建一个包含三个字段的结果对象:一个用于名称,一个用于区域,一个用于计数。如果覆盖equals和hash方法以仅考虑区域和名称,则集合中不会有重复项,可以使用它跟踪这些结果对象


实现这一点的另一种方法是创建一个映射,其中键是name+region,值是count。这也会使实现变得简单,并确保没有重复项。

听起来哈希表或映射可能很有用。您可以对原始数据进行单次传递,并使用映射查找名称,如果尚未看到,则添加名称,或者检查新条目是否超出了名称的值(如果超出了值)。这不需要提前排序;您可以在之后进行排序,从而节省大量时间:-)

我同意Mario的观点,您不应该在这里使用数组结构。使用冒泡排序的事实表明您正在学习某种编程入门课程,因此您可能不知道
ArrayList
s、
HashSet
s、
.equals()
方法等等,但这才是您真正想要做的。使用自定义
.equals()
方法创建自定义对象-类似于:

public class Record{
  String name;
  String region;

  public boolean equals(Object o){
    Record r = (Record)o;
    return name.equals(r.name) && region.equals(r.region);
  }

  public int hashCode(){
    return name.hashCode()+region.hashCode();
  }
}
然后,您可以使用
HashMap
检查集合中是否已经存在记录-如果已经存在,则将计数(映射的值)增加1,否则将其添加


如果希望所有内容都按特定顺序排序,可以定义一个自定义的
.compareTo()
方法并使用
树形图
,或者,如果希望所有内容都按插入顺序排序,则可以使用
LinkedHashSet
来保留该顺序。

虽然在技术上没有被弃用,但如果有帮助,您不想使用哈希表,HashMap的用法是正确的。如果可以使用某种哈希数据结构,为什么要使用ArrayList并进行第二次迭代?嗯,也许他/她想对数据进行某种排序。我知道集合可以解决许多问题,但是它对元素也没有顺序感,一个树形图可以让你定义一个自定义的顺序。不过,从问题的声音来看,排序只是为了识别重复项并将其删除。您可能是对的。我猜我是在假设他希望他的代码与现在的代码尽可能相似。不要忘记实现hashCode,否则此方法将无法工作,因为HashSet无法正确找到已插入的对象。同样,对于类似的东西,我会使用HashMap;记录只有名称和区域(与您的答案相同),而整数是计数。谢谢,是的,哈希代码绝对重要。非常感谢您的答案,它将我推向了正确的方向。