需要帮助JAVA

问题描述:

Here, I attached image file with my output and expected output. I have a problem for duplicate records.需要帮助JAVA

这里关于重复记录,我写我的代码以我的输出。我不知道如何处理重复记录。

class Price{ 
    int productID,totalSold=0,totalPrice=0; 
    double price; 
    public Price(int productID,double price) { 
     this.price= price; 
     this.productID=productID; 
    } 
} 
class Slips{ 
    int personID, productID, numberOfSold,product1Sold,product2Sold,product3Sold,product4Sold,performance; 
    public Slips(int personID,int productID,int numberOfSold) 
    { 
     this.personID=personID; 
     this.productID=productID; 
     this.numberOfSold=numberOfSold; 
    }  
} 

class PriceComparator implements Comparator<Price>{ 
    public int compare(Price p1,Price p2) 
    { 
     return Integer.compare(p2.totalPrice, p1.totalPrice); 
    } 
} 

public class PTestDec2009 { 

    static ArrayList<Price> ALPrice=new ArrayList<>(); 
    static ArrayList<Slips> ALSlips=new ArrayList<>();  

    public static void main(String[] args) throws FileNotFoundException, IOException { 
     getPriceInfo("C:\\Users\\Mayank Patel\\Documents\\NetBeansProjects\\PTestDec2009\\src\\ptestdec2009\\price.txt"); 
     getSlipsInfo("C:\\Users\\Mayank Patel\\Documents\\NetBeansProjects\\PTestDec2009\\src\\ptestdec2009\\slips.txt"); 
     updateSalability();   
     updateSalesPersonPerformance(); 
    } 

    private static void getPriceInfo(String fileName) throws FileNotFoundException, IOException { 
     String line=null; 
     BufferedReader bufferReader=new BufferedReader(new FileReader(fileName)); 
     while((line=bufferReader.readLine())!=null) 
     { 
      StringTokenizer tokenizer=new StringTokenizer(line); 
      while(tokenizer.hasMoreTokens()) 
      { 
       ALPrice.add(new Price(Integer.parseInt(tokenizer.nextToken()),Double.parseDouble(tokenizer.nextToken()))); 
      } 
     }  
    } 

    private static void getSlipsInfo(String fileName) throws FileNotFoundException, IOException { 
     String line=null; 
     BufferedReader bufferReader= new BufferedReader(new FileReader(fileName)); 
     while((line=bufferReader.readLine())!=null) 
     { 
      StringTokenizer tokenizer=new StringTokenizer(line); 
      while(tokenizer.hasMoreTokens()) 
      { 
       ALSlips.add(new Slips(Integer.parseInt(tokenizer.nextToken()),Integer.parseInt(tokenizer.nextToken()), Integer.parseInt(tokenizer.nextToken())));     
       //updateSalesPersonPerformance(Integer.parseInt(tokenizer.nextToken()),Integer.parseInt(tokenizer.nextToken()), Integer.parseInt(tokenizer.nextToken()));     
      }  
     } 
    } 

    private static void updateSalesPersonPerformance() 
    {   
     for(int plooper=0;plooper<ALPrice.size();plooper++) 
     { 
      for(int slooper=0;slooper<ALSlips.size();slooper++) 
      { 
       if(ALPrice.get(plooper).productID == ALSlips.get(slooper).productID) 
       { 
        switch (ALSlips.get(slooper).productID) { 
         case 1:       
          ALSlips.get(slooper).product1Sold += ALSlips.get(slooper).numberOfSold; 
          break; 
         case 2: 
          ALSlips.get(slooper).product2Sold += ALSlips.get(slooper).numberOfSold; 
          break; 
         case 3: 
          ALSlips.get(slooper).product3Sold += ALSlips.get(slooper).numberOfSold; 
          break; 
         case 4: 
          ALSlips.get(slooper).product4Sold += ALSlips.get(slooper).numberOfSold; 
          break; 
         default:        
          break; 
        } 
        ALSlips.get(slooper).performance += ALPrice.get(plooper).price* ALSlips.get(slooper).numberOfSold; 
       } 
      } 
     } 


     System.out.println("\nPERSONID"+"\t"+"PRODUCT1"+"\t"+"PRODUCT2"+"\t"+"PRODUCT3"+"\t"+"PRODUCT4"+"\t"+"PERFORMANCE"); 
     for(int slooper=0;slooper<ALSlips.size();slooper++) 
     {   
      System.out.println(ALSlips.get(slooper).personID+"\t\t"+ALSlips.get(slooper).product1Sold+"\t\t"+ALSlips.get(slooper).product2Sold+"\t\t"+ALSlips.get(slooper).product3Sold+"\t\t"+ALSlips.get(slooper).product4Sold+"\t\t"+ALSlips.get(slooper).performance); 
     }   
    } 

    private static void updateSalability() { 
    for(int plooper=0;plooper<ALPrice.size();plooper++) 
     { 
      for(int slooper=0;slooper<ALSlips.size();slooper++) 
      { 
       if(ALPrice.get(plooper).productID == ALSlips.get(slooper).productID) 
       { 
        ALPrice.get(plooper).totalSold += ALSlips.get(slooper).numberOfSold; 
        ALPrice.get(plooper).totalPrice += ALPrice.get(plooper).price * ALSlips.get(slooper).numberOfSold;      
       }    
      } 
     } 
    Collections.sort(ALPrice,new PriceComparator()); 
    System.out.println("PRODUCTID"+"\t"+"TotalSold"+"\t"+"TotalPrice"); 
    for(int plooper=0;plooper<ALPrice.size();plooper++) 
    { 
     System.out.println(ALPrice.get(plooper).productID+"\t\t"+ALPrice.get(plooper).totalSold+"\t\t"+ALPrice.get(plooper).totalPrice); 
    }  
    } 
} 

所以请帮助我得到我的预期输出。我用我的输出和期望的输出附加了图像文件。

在此先感谢。

+3

不要发布图片,如果你可以使用文字做,大多数人不会看图像,你不会得到帮助。 –

+0

感谢您的评论 – user3360610

+0

您是否使用JAVA8或更早版本的java修订版?这是有原因的,你可以使用流并为其使用聚合。你可否确认 ? –

只是用这样的:

public static void removeDuplicates(){ 
    ArrayList<Slips> newRay = new ArrayList<Slips>(); 
    for(Slips s : ALSlips){ 
     boolean hasAlready = false; 
     for(Slips d: newRay){ 
      if(d.personID == s.personID){ 
       d.product1Sold += s.product1Sold; 
       d.product2Sold += s.product2Sold; 
       d.product3Sold += s.product3Sold; 
       d.product4Sold += s.product4Sold; 
       d.numberOfSold += s.numberOfSold; 
       d.performance += s.performance; 
       hasAlready = true; 
      } 
     } 
     if(!hasAlready){ 
      newRay.add(s); 
     } 
    } 
    ALSlips = newRay; 
} 

虽然我求求你,请重写这个,或评论,或什么!除非你为你的工作做这件事。然后离开它是如何。他们将无法解雇你。

+0

这是获得我的预期输出的好方法。但是如何使用hashset或hashmap呢?你能给我一些代码吗?非常感谢您的帮助。 – user3360610

+0

这是令人难以置信的低效代码。为什么不休息,什么时候发现?当这有几千个元素时会发生什么?为什么不使用Set或HashMap? –

而不是使用ArrayList使用HashMapHashSet

这个地图的关键将是字符串PRODUCTID

目前你add荷兰国际集团到一个ArrayList,但如果你put你的HashMap,你可以先尝试get。如果存在,您可以更新其中的值。

一个例子是像

HashMap myMap <String, Price val> = new HashMap <>(); 

Price newPrice = ....; // like your existing code 
String prodid = newPrice.getProductId(); 
Price oldVal = myMap.get (prodid); 
if (oldVal != null) { 
    // update newPrice with sum of val 
} 
myMap.put (prodid, newPrice); // will add or replace 
+0

java中的'Set'集合类型呢?我会推荐套件而不是'HashMap' –

+1

@VikrantKashyap是的,你说得对,也许一个Set会更好地执行唯一性,但无论如何,有必要首先测试get的返回值 –

+0

感谢您的评论。但我不知道如何使用哈希映射?你能为我写下一些代码吗? – user3360610

如果你想消灭你可以使用重复设置或HashSet的,而不是ArrayList的,但如果你的馅对象放入你需要重写集合equals方法,使你的HashSet基于一些属性,而不是它的地址,例如作为重复治疗对象被覆盖的等于为你的问题可以

@Override 
public String eqauls(Slips s) 
{ 
    if(this.personId==s.personId) 
      return true; 
    else 
     return false; 
} 

这应该被放置在你的单类。 我不是你的要求完全清楚,但是这是你如何消除重复