Java >> Java opplæring >  >> Tag >> String

Kode tar evigheter å unnlate når den ble slått til streng Java? [lukket]

Stengt. Dette spørsmålet trenger feilsøkingsdetaljer. Den godtar foreløpig ikke svar.

Rediger spørsmålet for å inkludere ønsket oppførsel, et spesifikt problem eller feil, og den korteste koden som er nødvendig for å gjenskape problemet. Dette vil hjelpe andre med å svare på spørsmålet.

Stengt for 12 måneder siden.

Forbedre dette spørsmålet

Når jeg endrer String m1 til en 2D int-array, kjører den superfort, men nå tar det over en time å bare sløyfe 10 bilder, og hvert bilde tar nesten dobbelt så lang tid som det første tok. Er det en måte hvor jeg kan forbedre koden min slik at den kjører raskere ettersom jeg må lagre alle verdier som én streng til slutt?

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectOutput;
import java.io.*;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.imageio.ImageIO;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.*;
import java.awt.Color;
import java.awt.image.BufferedImage;

public class Convertt {
    static String[][] allImages = new String[304][76808];
    static String m1 = "";
    static int f = 0;

    public static void rgb1(Path path) throws IOException {
        File file = new File(String.valueOf(path));
        BufferedImage img = ImageIO.read(file);
        for (int y = 0; y < img.getHeight(); y++) {
            for (int x = 0; x < img.getWidth(); x++) {
                int pixel = img.getRGB(x, y);
                Color color = new Color(pixel, true);
                int red = color.getRed();
                int green = color.getGreen();
                int blue = color.getBlue();
                if (m1 == "") {
                    m1 = (red + ":" + green + ":" + blue);
                    System.out.println(m1);
                } else {
                    m1 = m1 + ":" + red + ":" + green + ":" + blue;
                }
            }
        }
        f++;
        System.out.println("Done with" + f);
    }

    public static void main(String[] args) throws IOException {
        Path imgFolder = Paths.get("D:\swim\Frames1");
        int k = 1;
        for (int i = 0; i < 273; i++) {
            rgb1(imgFolder.resolve("frames" + k + ".png"));
            k++;
        }
        System.out.println("done");

        FileWriter writer = new FileWriter("D:\swim\Output\new1.csv");
        writer.append(m1);
    }
}

Svar

Din forståelse av strengytelse kan være problemet.

Strenger er uforanderlige, så hver endring av en streng lager en ny streng, den endrer ikke den eksisterende strengen.

if (m1=="") {
    m1=(red+":"+green+":"+blue);
    System.out.println(m1);
} else {
    m1=m1+":"+red+":"+green+":"+blue;
}

oppretter ikke én streng. Den oppretter en streng for den røde verdien, lager deretter en streng som inneholder det i tillegg til en ":", og lager deretter en streng som inneholder det i tillegg til den grønne verdien, og lager deretter en streng som inneholder det i tillegg til den …. (og så videre)

Så bruk i stedet en StringBuilder, som er som en buffer av RAM som inneholder strenginnhold som kan manipuleres uten å lage nye strenger. Når du vil ha strengverdien for bufferen, ring .toString() for å lage en ny streng.


Java Tag