Java 如何进一步优化代码?
祝大家今天愉快 我有一些代码,可以在几秒钟内完成Excel Pivot的工作。然而,我的代码在不少于30分钟内完成了同样的事情。我对这种差异感到敬畏!我确信我可以优化我的代码,使之比目前快得多。我们将非常感谢您的帮助 请快速查看代码。如有必要,我将详细解释它的具体功能。谢谢大家!Java 如何进一步优化代码?,java,optimization,arraylist,hashset,Java,Optimization,Arraylist,Hashset,祝大家今天愉快 我有一些代码,可以在几秒钟内完成Excel Pivot的工作。然而,我的代码在不少于30分钟内完成了同样的事情。我对这种差异感到敬畏!我确信我可以优化我的代码,使之比目前快得多。我们将非常感谢您的帮助 请快速查看代码。如有必要,我将详细解释它的具体功能。谢谢大家! public void countImages(ArrayList<String> all) throws IOException { HashSet<String> uStri
public void countImages(ArrayList<String> all) throws IOException {
HashSet<String> uStrings = new HashSet<>();
int Counter = 0;
int C500x500 = 0;
int C800x800 = 0;
int C1000x1000 = 0;
int G1000x1000 = 0;
write("Vendor ID, Count of Images, Less than 500 x 500, Less than 800 x 800, Less than 1000 x 1000, Greater than 1000 x 1000", "ImageCount_Data");
for (String single : all) {
String[] linearray = single.split(",");
uStrings.add(linearray[0]);
}
totallines = uStrings.size();
completedlines = 0;
percentage = 0;
setPercent(0);
for (String uString : uStrings) {
Counter = 0;
C500x500 = 0;
C800x800 = 0;
C1000x1000 = 0;
G1000x1000 = 0;
for (String single : all) {
String[] linearray = single.split(",");
if (linearray[0].equals(uString)) Counter++;
if ((linearray[1].equals("Less than 500 x 500")) && linearray[0].equals(uString)) C500x500++;
if ((linearray[1].equals("Less than 800 x 800")) && linearray[0].equals(uString)) C800x800++;
if ((linearray[1].equals("Less than 1000 x 1000")) && linearray[0].equals(uString)) C1000x1000++;
if ((linearray[1].equals("Greater than 1000 x 1000")) && linearray[0].equals(uString)) G1000x1000++;
} //END OF 2ND FOR LOOP
write(uString + "," + Counter + "," + C500x500 + "," + C800x800 + "," + C1000x1000 + "," + G1000x1000, "ImageCount_Data");
completedlines++;
percentage = (completedlines / totallines) * 100;
setPercent(Math.round(percentage));
Icwindow.frame.setTitle("Writing Image Count Data: " + getPercent() + "%");
} //END OF 1ST FOR LOOP
Icwindow.frame.setTitle("Process Cloudinary ImageCount Data");
}
public void countImages(ArrayList all)引发IOException{
HashSet uStrings=新HashSet();
int计数器=0;
int C500x500=0;
int C800x800=0;
int C1000x1000=0;
int G1000x1000=0;
写入(“供应商ID,图像计数,小于500 x 500,小于800 x 800,小于1000 x 1000,大于1000 x 1000”,“图像计数_数据”);
for(字符串单:全部){
String[]linearray=single.split(“,”);
添加(线性阵列[0]);
}
totalines=uStrings.size();
completedlines=0;
百分比=0;
设定百分比(0);
用于(字符串uString:uString){
计数器=0;
C500x500=0;
C800x800=0;
C1000x1000=0;
G1000x1000=0;
for(字符串单:全部){
String[]linearray=single.split(“,”);
if(linearray[0]。等于(uString))计数器++;
如果((线性阵列[1].等于(“小于500 x 500”)&&linearray[0].等于(uString))C500x500++;
如果((linearray[1].equals(“小于800 x 800”)&&linearray[0].equals(uString))C800x800++;
如果((linearray[1].equals(“小于1000 x 1000”)&&linearray[0].equals(uString))C1000x1000++;
如果((linearray[1].equals(“大于1000 x 1000”)&&linearray[0].equals(uString))G1000x1000++;
}//第二个FOR循环结束
写入(uString+”、“+计数器+”、“+C500x500+”、“+C800x800+”、“+C1000x1000+”、“+G1000x1000”、“图像计数数据”);
completedlines++;
百分比=(完成行/总计)*100;
设置百分比(数学四舍五入(百分比));
Icwindow.frame.setTitle(“写入图像计数数据:“+getPercent()+”%”);
}//第1个FOR循环结束
Icwindow.frame.setTitle(“处理Cloudinary ImageCount数据”);
}
您正在迭代第0列中所有可能的字符串,然后在该循环中再次迭代所有字符串。因此,您的算法是O(n²),Excel可以使用更快的(可能是O(n)摊销)算法
您可以使用HashMap
来跟踪计数,其中只有一个for循环,而不是两个嵌套循环
然后,Counts
对象将包含类的计数,如下所示:
class Counts {
int c500;
int c800;
int c1000;
int cOther;
void count(String s) {
switch(s) {
case "Less than 500 x 500": c500++; break;
case "Less than 500 x 500": c800++; break;
case "Less than 500 x 500": c1000++; break;
case "Greater than 1000 x 1000": cOther++; break;
default: throw new AssertionError();
}
}
}
另一个提示:您可以通过添加c500+c800+c1000+cOther
获得全局计数器,非常感谢
下面是我使用哈希映射的新代码,它确实比我以前的代码快得多。但是,代码中似乎有不正确的地方,原因是计数仅对第一个哈希映射正确,其余4个Has映射的计数不正确。我可以请你看一下并告诉我你是否注意到新代码中有什么奇怪的地方吗
编辑-我错过了在switch case语句中添加中断!这工作完美且快速!:D
public void countImages(ArrayList<String> all) throws IOException {
HashMap<String, Integer> counter = new HashMap<>();
HashMap<String, Integer> c500 = new HashMap<>();
HashMap<String, Integer> c800 = new HashMap<>();
HashMap<String, Integer> c1000 = new HashMap<>();
HashMap<String, Integer> g1000 = new HashMap<>();
write("Vendor ID, Count of Images, Less than 500 x 500, Less than 800 x 800, Less than 1000 x 1000, Greater than 1000 x 1000", "ImageCount_Data");
for (String single : all) {
String[] linearray = single.split(",");
if (!counter.containsKey(linearray[0])) {
counter.put(linearray[0], 1);
} else {
counter.put(linearray[0], counter.get(linearray[0]) + 1);
}
switch (linearray[1]) {
case "Less than 500 x 500" :
if (!c500.containsKey(linearray[0])) {
c500.put(linearray[0], 1);
} else {
c500.put(linearray[0], c500.get(linearray[0]) + 1);
}
case "Less than 800 x 800" :
if (!c800.containsKey(linearray[0])) {
c800.put(linearray[0], 1);
} else {
c800.put(linearray[0], c800.get(linearray[0]) + 1);
}
case "Less than 1000 x 1000":
if (!c1000.containsKey(linearray[0])) {
c1000.put(linearray[0], 1);
} else {
c1000.put(linearray[0], c1000.get(linearray[0]) + 1);
}
case "Greater than 1000 x 1000" :
if (!g1000.containsKey(linearray[0])) {
g1000.put(linearray[0], 1);
} else {
g1000.put(linearray[0], g1000.get(linearray[0]) + 1);
}
}
}
for (String key : counter.keySet()) {
write(key + "," + counter.get(key) + "," + c500.get(key) + "," + c800.get(key) + "," + c1000.get(key) + "," + g1000.get(key), "ImageCount_Data");
}
}
public void countImages(ArrayList all)引发IOException{
HashMap计数器=新HashMap();
HashMap c500=新的HashMap();
HashMap c800=新的HashMap();
HashMap c1000=新的HashMap();
HashMap g1000=新的HashMap();
写入(“供应商ID,图像计数,小于500 x 500,小于800 x 800,小于1000 x 1000,大于1000 x 1000”,“图像计数_数据”);
for(字符串单:全部){
String[]linearray=single.split(“,”);
if(!counter.containsKey(linearray[0])){
计数器put(线性阵列[0],1);
}否则{
counter.put(linearray[0],counter.get(linearray[0])+1);
}
开关(线性阵列[1]){
“小于500 x 500”的情况:
如果(!c500.containsKey(linearray[0])){
c500.put(线性阵列[0],1);
}否则{
c500.put(linearray[0],c500.get(linearray[0])+1;
}
“小于800 x 800”的情况:
如果(!c800.containsKey(linearray[0])){
c800.put(linearray[0],1);
}否则{
c800.put(linearray[0]、c800.get(linearray[0])+1;
}
“小于1000 x 1000”的情况:
如果(!c1000.containsKey(linearray[0])){
c1000.put(线性阵列[0],1);
}否则{
c1000.put(linearray[0],c1000.get(linearray[0])+1;
}
“大于1000 x 1000”的情况:
如果(!g1000.containsKey(linearray[0])){
g1000.put(线性阵列[0],1);
}否则{
g1000.put(linearray[0],g1000.get(linearray[0])+1;
}
}
}
for(字符串键:counter.keySet()){
写入(键+”、“+计数器.获取(键)+”、“+c500.获取(键)+”、“+c800.获取(键)+”、“+c1000.获取(键)+”、“+g1000.获取(键)、“图像计数数据”);
}
}
您有三个循环,我相信您只需要一个就可以完成。谢谢您!有人告诉我,上次我在做一个类似的程序,但我真的不明白,我是怎么做的。你能帮我写一个简短的示例代码吗?我想,我明白了。这样就可以解决我的计数问题了。但是,我正在计算3个不同字符串的重复次数。如何在一个循环中实现这一点?我在回答中添加了一个示例片段。